Почему тип этой функции (a → a) → a?
Prelude> let y f = f (y f)
Prelude> :t y
y :: (t -> t) -> t
Должен ли он быть бесконечным/рекурсивным типом? Я собирался попытаться выразить словами, что, по-моему, это тип, должен быть, но я просто не могу сделать это по какой-то причине.
y :: (t -> t) -> ?WTFIsGoingOnOnTheRHS?
Я не понимаю, как f (y f) разрешает значение. Следующее имеет для меня немного больше смысла:
Prelude> let y f x = f (y f) x
Prelude> :t y
y :: ((a -> b) -> a -> b) -> a -> b
Но это все еще смешно сбивает с толку. Что происходит?