[Haskell] Type of y f = f . f
Benjamin.Rudiak-Gould at cl.cam.ac.uk
Mon Feb 28 13:03:08 EST 2005
Pedro Vasconcelos wrote:
>Jim Apple <japple at freeshell.org> wrote:
>>Is there a type we can give to
>>y f = f . f
>>are all typeable?
>Prelude> let y f = f.f
>Prelude> :t y
>y :: forall c. (c -> c) -> c -> c
>So it admits principal type (a->a) -> a->a. From this you can see that
>(y head) and (y fst) cannot be typed, whereas (y id) can.
I think the OP's point is that all three of his examples make sense, and
the resulting functions would have Haskell types, yet there doesn't seem
to be a Haskell type which permits all three uses of y. I can come up
with types which permit any one of the three:
y :: forall a. (a -> a) -> a -> a
y :: forall a f. (forall x. f x -> x) -> f (f a) -> a
y :: forall a b c f. (forall x y. f x y -> x) -> f (f a b) c -> a
but I can't find a type which permits more than one. It can probably be
done with type classes.
More information about the Haskell