函数应用程序编译错误

zer*_*ing 0 haskell

我正在尝试学习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这是错的?

mel*_*ene 5

如果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拥有"无限型"的原因.