Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 为什么应用程序只能默认为_Haskell_Functor_Applicative - Fatal编程技术网

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