为什么申请工作仅针对Maybe默认

时间:2019-03-29 14:46:29

标签: haskell functor applicative

我试图了解为什么对于像Maybe这样的某些函子,应用函子默认情况下是起作用的(无需实现),而对于其他函子却没有:

示例:
Just (+3) <*> (Just 3)可以“开箱即用”-> 6
Left (+3) <*> Left 3不起作用
即使我声明了Just (+3) <*> Left 4Either 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

我在这个假设中正确吗?

1 个答案:

答案 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