In effect, this is a demonstration that Haskell supports recursive
values and not just recursive functions. If the a in

fix :: (a -> a) -> a

were to be unified always with a function type, then that would imply
that the language only supported recursive definitions for functions,
which would be a bit unfortunate for the co-coders in the community.

It's good to note that simple languages with a strict evaluation
scheme are limited to

fix :: ((a -> b) -> (a -> b)) -> (a -> b)

because functions are the only things that can delay evaluation.

On 3/20/07, Paul Hudak <[EMAIL PROTECTED]> wrote:
Assuming 1 :: Int, then:
ones = 1 : ones
is equivalent to:
ones = fix (\ones -> 1:ones)
where fix has type ([Int] -> [Int]) -> [Int].

It's also the case that:
inf = 1+inf
is equivalent to:
inf = fix (\inf -> 1+inf)
where fix has type (Int -> Int) -> Int.
Unfortunately (perhaps), the fixed point returned is _|_,
since it is the LEAST solution to the recursive equation.

    -Paul


Dan Weston wrote:
> But in fact it seems to me that the type variable "a" not only can,
> but must unify with "b->c".
>
> Is there any use of fix for which this is not true? If this is true,
> is the type "a" instead of "b->c" because it is not possible in
> general for the type checker to verify this fact, making it some kind
> of underivable true statement?
>
> If it is not true, I would dearly love to see a use of fix with a type
> for which functional application is not defined.
>
> For me, it is this aspect (the type of fix) that has made it so much
> harder to understand fix than it should have been.
>
> Dan

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to