Applicative Functor - 函数不映射

Applicative Functors - function not mapping

为什么这有效:

(+) <$> (*2) <*> (*2) $ 2

但是这个没有?

(+) <$> (*2) <*> (*2) <*> (*2) $ 2 (错误是:无法构造无限类型)

然而这个确实如此:

(\x y z -> x + y + z) <$> (*2) <*> (*2) <*> (*2) $ 2

抱歉,如果这些是微不足道的问题,我正在学习 Haskell 并希望在继续下一个主题之前确保我完全理解它。

(+)(\x y -> x + y) 相同,或者如果您在范围 (\x y z -> (x + y) z) 中有一个非常奇怪的 Num 实例,这与 [=14] 不同=].简单的解释是 (+) 有两个参数,而在您的 non-working 片段中,您试图将其传递三个。您的第三个代码段有效,因为您使用了两个 + 而不是一个。考虑 (+) 4 4(+) ((+) 4 4) 4 都是有效的,但 (+) 4 4 4 不是。

(+)的类型是Int -> Int -> Int(其实比较笼统,但是我在这个例子中使用具体的类型Int)。所以,它是一个以两个整数作为输入的函数。

(\x y z -> x + y + z)的类型是Int -> Int -> Int -> Int。所以,它是一个以三个整数作为输入的函数。

这两个函数不能互换,因为类型不一样

也许您的困惑源于不明确的错误信息。如果你真的像这样写出 (+) 的具体类型:

ghci> ((+) :: Int -> Int -> Int) <$> (* 2) <*> (* 2 ) <*> (* 2) $ 2

然后你会得到一个更好的错误信息:

<interactive>:7:1: error:
    * Couldn't match type `Int' with `Int -> t'
      Expected type: Int -> Int -> t
        Actual type: Int -> Int
    * Possible cause: `(<*>)' is applied to too many arguments
      ...
    * Relevant bindings include it :: t (bound at <interactive>:7:1)

还是不是很清楚,但至少它提到参数的数量是关闭的。