为什么应用程序默认仅适用于 Maybe

Why does applicative work default only for Maybe

我试图理解为什么应用仿函数默认情况下(不需要实现)对某些仿函数(如 Maybe 但对其他仿函数不起作用:

示例:
Just (+3) <*> (Just 3) 工作正常 "out of the box"- > 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

我的假设是否正确?

EitherApplicative 实例定义为:

instance Applicative (Either e) where ...

鉴于 (<*>) 的类型是 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 包含要操作的函数和值,所以使用 Right 构造函数确实有效:

Right (+3) <*> Right 3
=> Right 6