Beh, y
deve essere di tipo (a -> b) -> c
, per alcuni a
, b
e c
non sappiamo ancora; dopo tutto, prende una funzione, f
, e la applica a un argomento, quindi deve essere una funzione che accetta una funzione.
Dal y f = f x
(ancora una volta, per alcuni x
), sappiamo che il tipo di ritorno di y
deve essere il tipo di ritorno di f
stessa. Quindi, possiamo perfezionare il tipo di un po ': deve essere (a -> b) -> b
per alcuni a
e che non conosciamo ancora.
Per capire che cos'è a
, dobbiamo solo guardare il tipo di valore passato a f
. È y f
, che è l'espressione che stiamo cercando di capire il tipo di adesso. Stiamo dicendo che il tipo di è (a -> b) -> b
(per alcuni a
, , ecc.), Quindi possiamo dire che questa applicazione di y f
deve essere di tipo .
Quindi, il tipo dell'argomento su f
è b
. Rimettiamo tutto insieme e otteniamo (b -> b) -> b
- che è, ovviamente, la stessa cosa di (a -> a) -> a
.
Ecco una visione più intuitiva, ma meno preciso delle cose: stiamo dicendo che y f = f (y f)
, che siamo in grado di espandersi per l'equivalente y f = f (f (y f))
, y f = f (f (f (y f)))
, e così via. Quindi, sappiamo che possiamo sempre applicare un altro f
a tutto il resto, e poiché "l'intera cosa" in questione è il risultato dell'applicazione di f
a un argomento, f
deve avere il tipo a -> a
; e poiché abbiamo appena concluso che il tutto è il risultato dell'applicazione di f
a un argomento, il tipo restituito di deve essere quello di f
stesso - riunito, di nuovo, come (a -> a) -> a
.
Supponendo che questo sia un codice reale, basta sparare a chiunque sia venuto fuori con questo. –
@ Martininames: Huh? Cosa pensi che sia sbagliato con il codice?Non è il modo migliore per definire la funzione, ma è la più semplice. –
@MartinJames, quella funzione è una funzione ben studiata chiamata [Y Combinator] (http://en.wikipedia.org/wiki/Fixed-point_combinator). (Penso che sia giusto - Non posso ricontrollare Wikipedia al momento!) Comunque, potresti essere licenziato per essere un tale filisteo :-) –