我试图了解为什么对于像Maybe
这样的某些函子,应用函子默认情况下是起作用的(无需实现),而对于其他函子却没有:
示例:
Just (+3) <*> (Just 3)
可以“开箱即用”-> 6
Left (+3) <*> Left 3
不起作用
即使我声明了Just (+3) <*> Left 4
,Either Int Int
也无法正常工作。
在99%的情况下,当我处理成对的(f (a->b) , f a)
时,您必须自己实现所需的行为(笛卡尔积 (f (a->b)) X (f a)
),第一个示例只是开箱即用的简单内容。
示例
对于(Maybe (a->b) , Either c d)
,我们需要涵盖所有4种情况:
Just - Left
Just - Right
Nothing - Left
Nothing -Right
我在这个假设中正确吗?
答案 0 :(得分:7)
Applicative
的{{1}}实例定义为:
Either
鉴于instance Applicative (Either e) where ...
的{{1}}类型为(<*>)
,即:
Applicative f => f (a -> b) -> f a -> f b
Either
的类型为Either e (a -> b) -> Either e a -> Either e b
,因此Left
的类型为
e -> Either e a
,Left (+3)
的类型是:
Num a => Either (a -> a) b
导致Left 3
的类型为Num a => Either a b
,这不太可能是您想要的。
由于类型Left (+3) <*> Left 3
包含要操作的函数和值,因此使用(Num a, Num (a -> a)) => Either (a -> a) b
构造函数可以正常工作:
b