为什么应用程序默认仅适用于 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
我的假设是否正确?
Either
的 Applicative
实例定义为:
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
我试图理解为什么应用仿函数默认情况下(不需要实现)对某些仿函数(如 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
我的假设是否正确?
Either
的 Applicative
实例定义为:
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