我正在尝试学习haskell并且无法配置它,为什么以下代码片段无法编译:
*Uncurry> applyTwice f x = f f x
<interactive>:14:20: error:
• Occurs check: cannot construct the infinite type:
t ~ t -> t2 -> t1
• In the first argument of ‘f’, namely ‘f’
In the expression: f f x
In an equation for ‘applyTwice’: applyTwice f x = f f x
• Relevant bindings include
x :: t2 (bound at <interactive>:14:14)
f :: t -> t2 -> t1 (bound at <interactive>:14:12)
applyTwice :: (t -> t2 -> t1) -> t2 -> t1
(bound at <interactive>:14:1)
Run Code Online (Sandbox Code Playgroud)
这没关系:
applyTwice f x = f (f x)
Run Code Online (Sandbox Code Playgroud)
在haskell函数应用程序是左关联的,第一个代码片段将适用于:
(f f) x
Run Code Online (Sandbox Code Playgroud)
为什么(f f) x这是错的?
如果f f有效,那将是什么类型f?
我们正在申请f一个论证,所以f必须是一个函数:f :: a -> b对于某些类型a,b.
我们将函数应用于的参数是f,所以它的类型必须是a:( f :: a即我们有(f :: a -> b) (f :: a)).
因为这些都是相同的f,我们得到a -> b = a.如果a是相同的a -> b,那么我们可以替换a,并且a -> b是相同的(a -> b) -> b,它们是相同的((a -> b) -> b) -> b,等等.
这种扩张永远不会结束,这就是ghc抱怨f拥有"无限型"的原因.