Haskell 为什么应用程序只能默认为
我试图理解为什么应用程序函子在默认情况下(无需实现)对某些函子有效,如Haskell 为什么应用程序只能默认为,haskell,functor,applicative,Haskell,Functor,Applicative,我试图理解为什么应用程序函子在默认情况下(无需实现)对某些函子有效,如可能,但对其他函子无效: 示例: Just(+3)(Just 3)可以“开箱即用”->6 Left(+3)Left 3不起作用 仅(+3)左4不起作用,即使我声明了或Int 我假设在99%的情况下,当处理成对的:(f(a->b),fa)时,您必须自己实现所需的行为(笛卡尔积((f(a->b))X(fa)),第一个示例只是一些简单的开箱即用的东西 示例 如果是(可能是(a->b),或者是cd)我们需要涵盖所有4种情况: 就在左边
可能
,但对其他函子无效:
示例:Just(+3)(Just 3)
可以“开箱即用”->6
Left(+3)Left 3
不起作用仅(+3)左4
不起作用,即使我声明了或Int
我假设在99%的情况下,当处理成对的:(f(a->b),fa)
时,您必须自己实现所需的行为(笛卡尔积((f(a->b))X(fa)
),第一个示例只是一些简单的开箱即用的东西
示例
如果是(可能是(a->b),或者是cd)
我们需要涵盖所有4种情况:就在左边
恰到好处
什么都没剩
无-对
我的假设正确吗?对于
或的应用实例定义为:
instance Applicative (Either e) where ...
给定()
的类型为应用型f=>f(a->b)->f a->f b
用于或,即:
Either e (a -> b) -> Either e a -> Either e b
Left
的类型是e->ea
,因此Left(+3)
的类型是
Num a => Either (a -> a) b
Left 3
的类型为:
Num a => Either a b
这导致Left(+3)Left 3
的类型为(Num a,Num(a->a))=>或者(a->a)b
,这不太可能是您想要的
由于它是包含要操作的函数和值的类型b
,因此使用Right
构造函数确实有效:
Right (+3) <*> Right 3
=> Right 6
右侧(+3)右侧3
=>右6
Right(+3)Right 3
有效Left
不包含函子操作的类型。此外,Just(+3)
和Left 4
是完全不兼容的类型。因此,包含函数的函子必须与值为?Right的函子的类型相同。更一般地说,当用一个具体类型替换一个类型变量(f
,a
,b
)时,所有出现的变量都被替换为相同的值。@Bercoviciarian是的,准确地说。您可以使用
将任一字符串(Int->Bool)
和任一字符串Int
组合成另一个字符串Bool
。任一字符串
部分必须相同:它是用于两个参数和结果类型的同一个函子。实际上,()::f(a->b)->fa->fb
使用同一个应用程序函子f
三次(例如f=任一字符串
)。查看
的类型:applicative f=>f(a->b)->fa->fb
。始终使用相同的应用函子。您希望刚(+3)左4
的结果是什么,刚7
或左7
的结果是什么?如果您写的“与所需类型不匹配”,则可能会产生混淆。这些类型是统一的,因为Num n=>或者(n->n)(a->b)
,即使应用程序实例没有达到OP的预期。不仅如此,而且Left(+3)Left 3
是一个错误,因为3
和(+3)
没有相同的类型(除非您为(数字a)=>a->a
)