繁体   English   中英

Applicative Functors - function 不映射

[英]Applicative Functors - function not mapping

为什么这有效:

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

但是这个没有?

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

然而这个确实:

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

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

(+)(\xy -> x + y)相同,或者如果您在 scope (\xyz -> (x + y) z)中有一个非常奇怪的Num实例,它与(\xyz -> x + y + z) 简单的解释是(+)需要两个 arguments,而在您的非工作代码段中,您试图将其传递三个。 您的第三个代码段有效,因为您使用的是两个+而不是一个。 考虑(+) 4 4(+) ((+) 4 4) 4都是有效的,但(+) 4 4 4不是。

(+)的类型是Int -> Int -> Int (其实更通用,但我在这个例子中使用具体类型Int )。 因此,它是一个 function,它接受两个整数作为输入。

(\xyz -> x + y + z)的类型是Int -> Int -> Int -> Int 因此,它是一个 function,它将三个整数作为输入。

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

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

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)

还是不是很清楚,但至少它提到了 arguments 的号码是关闭的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM