You are doing nothing wrong. fix id
is an infinite loop.
When we say that fix
returns the least fixed point of a function, we mean that in the domain theory sense. So fix (x -> 2*x-1)
is not going to return 1
, because although 1
is a fixed point of that function, it is not the least one in the domain ordering.
I can't describe the domain ordering in a mere paragraph or two, so I will refer you to the domain theory link above. It is an excellent tutorial, easy to read, and quite enlightening. I highly recommend it.
For the view from 10,000 feet, fix
is a higher-order function which encodes the idea of recursion. If you have the expression:
let x = 1:x in x
Which results in the infinite list [1,1..]
, you could say the same thing using fix
:
fix (x -> 1:x)
(Or simply fix (1:)
), which says find me a fixed point of the (1:)
function, IOW a value x
such that x = 1:x
... just like we defined above. As you can see from the definition, fix
is nothing more than this idea -- recursion encapsulated into a function.
It is a truly general concept of recursion as well -- you can write any recursive function this way, including functions that use polymorphic recursion. So for example the typical fibonacci function:
fib n = if n < 2 then n else fib (n-1) + fib (n-2)
Can be written using fix
this way:
fib = fix (f ->
-> if n < 2 then n else f (n-1) + f (n-2))
Exercise: expand the definition of fix
to show that these two definitions of fib
are equivalent.
But for a full understanding, read about domain theory. It's really cool stuff.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…