Non pretendo di capirlo affatto, ma se questo aiuta qualcuno ... allora yippee.
Considera la definizione di fix
. fix f = let x = f x in x
. La parte sbalorditiva è che x
è definita come f x
. Ma pensaci un attimo.
x = f x
Poiché x = fx, possiamo sostituire il valore di x
sul lato destro di quello, giusto? Perciò...
x = f . f $ x
x = f . f . f $ x
x = f . f . f . f . f . f . f . f . f . f . f $ x
Quindi il trucco è, per terminare, f
deve generare una sorta di struttura, in modo che un successivof
modello possa abbinare quella struttura e terminare la ricorsione, senza realmente preoccuparsi del pieno "valore" del suo parametro (?)
A meno che, ovviamente, non si desideri fare qualcosa come creare un elenco infinito, come illustrato da luqui.
La spiegazione fattoriale di TomMD è buona. La firma del tipo di Fix è (a -> a) -> a
. La firma tipo per (\recurse d -> if d > 0 then d * (recurse (d-1)) else 1)
è (b -> b) -> b -> b
, in altre parole, (b -> b) -> (b -> b)
. Quindi possiamo dirlo a = (b -> b)
. In questo modo, fix prende la nostra funzione, che è a -> a
, o davvero (b -> b) -> (b -> b)
, e restituirà un risultato di tipo a
, in altre parole,b -> b
, in altre parole, un'altra funzione!
Aspetta, pensavo dovesse restituire un punto fisso ... non una funzione. Ebbene sì, più o meno (poiché le funzioni sono dati). Puoi immaginare che ci abbia dato la funzione definitiva per trovare un fattoriale. Gli abbiamo dato una funzione che non sa come ricorrere (quindi uno dei parametri è una funzione usata per ricorrere), efix
insegnato come ricorrere.
Ricordi come ho detto che f
deve generare una sorta di struttura in modo che un f
modello successivo possa corrispondere e terminare? Beh, non è esattamente vero, immagino. TomMD ha illustrato come possiamo espandere x
per applicare la funzione e avanzare verso il caso base. Per la sua funzione, ha usato un if / then, e questo è ciò che causa la terminazione. Dopo ripetute sostituzioni, la in
parte dell'intera definizione di fix
alla fine cessa di essere definita in termini di x
e cioè quando è calcolabile e completa.
fix error
ghci e sentirsi bene con se stessi".