[英]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.