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)
还是不是很清楚,但至少它提到参数的数量是关闭的。
为什么这有效:
(+) <$> (*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)
还是不是很清楚,但至少它提到参数的数量是关闭的。