为什么这个函数的类型是 (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
但这仍然非常令人困惑。发生了什么?
λf.(λx.f (x x)) (λx.f (x x))
。然而,在Haskell中这不能简单地进行类型标注(在简单类型λ演算中也不可能进行类型标注;双关语)。自应用(x x)
的需要要求在类型层面上进行递归。在Haskell中,您可以通过将其包装到newtype Rec a = In { out :: Rec a -> a }
中来避免类型递归a = a -> a
。 - Vitus