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

Ber*_*ian 0 haskell functor applicative

我试图了解为什么对于某些函子,应用函子默认工作(无需实现),而对于某些函子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

在这种假设下我正确吗?

Lee*_*Lee 7

Applicative实例Either定义为:

instance Applicative (Either e) where ...
Run Code Online (Sandbox Code Playgroud)

给定的类型(<*>)就是Applicative f => f (a -> b) -> f a -> f bEither那就是:

Either e (a -> b) -> Either e a -> Either e b
Run Code Online (Sandbox Code Playgroud)

的类型Left是,e -> Either e a所以的类型Left (+3)

Num a => Either (a -> a) b
Run Code Online (Sandbox Code Playgroud)

的类型Left 3是:

Num a => Either a b
Run Code Online (Sandbox Code Playgroud)

这导致了类型Left (+3) <*> Left 3(Num a, Num (a -> a)) => Either (a -> a) b这不太可能是你的原意。

因为它是b包含要操作的函数和值的类型,所以使用Right构造函数确实可以:

Right (+3) <*> Right 3
=> Right 6
Run Code Online (Sandbox Code Playgroud)