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
在这种假设下我正确吗?
的Applicative实例Either定义为:
instance Applicative (Either e) where ...
Run Code Online (Sandbox Code Playgroud)
给定的类型(<*>)就是Applicative f => f (a -> b) -> f a -> f b为Either那就是:
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)