【发布时间】:2019-04-20 20:57:22
【问题描述】:
我试图了解 applicative 以及如何将其用作 K 函数和 N 参数之间的笛卡尔积,但我无法理解为什么我不能执行以下操作:
[Just (+1),Just (+2)] <*> [Just 1 ,Just 2] 渲染
错误
* Couldn't match expected type `Maybe Integer -> b'
with actual type `Maybe (Integer -> Integer)'
* Possible cause: `Just' is applied to too many arguments In the expression: Just (+ 1) In the first argument of `(<*>)', namely `[Just (+ 1), Just (+ 2)]'
In the expression: [Just (+ 1), Just (+ 2)] <*> [Just 1, Just 2]
我不明白,因为根据定义,它应该将函数从上下文中取出,取值并应用所有组合。
我也试过了:
有人能解释一下吗?
【问题讨论】:
-
上下文(在本例中为
[])不包含函数。它包含Maybes。所以试图在上下文中应用函数是一个类型错误。这就是为什么错误说它需要一个函数但实际上得到了一个Maybe。请改用[(+1), (+2)] <*> [1,2]。 -
这里有两个级别的函子:一个列表和一个
Maybe。 -
您是否故意尝试组合两个应用程序
[]和Maybe?如果是这样,那么默认情况下这将不起作用,因为 GHC 不了解您正在使用组合。您需要为组合创建一个新类型,可以使用Compose 或使用newtype MaybeList a = [Maybe a]之类的“手动”(然后为MaybeList提供您自己的Applicative实例)。
标签: haskell cartesian-product applicative