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_Ghci_Applicative - Fatal编程技术网

Haskell 了解

Haskell 了解,haskell,ghci,applicative,Haskell,Ghci,Applicative,我大致了解了applicative运算符,但无法理解以下示例中得到的签名: ghci> let f x y z = x + y + z -- f::Num a => a -> a -> a -> a ghci> f <$> Just 2 <*> Just 3 <*> Just 4 Just 9 这将导致一个整数。 显然这不是真的,所以你能帮我理解如何阅读f的类型吗 以a->a->a->b函数和a作为参数并返回b的函数

我大致了解了applicative运算符,但无法理解以下示例中得到的签名:

ghci>  let f x y z = x + y + z  -- f::Num a => a -> a -> a -> a
ghci> f <$> Just 2 <*> Just 3 <*> Just 4 
Just 9
这将导致一个整数。 显然这不是真的,所以你能帮我理解如何阅读f的类型吗

以a->a->a->b函数和a作为参数并返回b的函数

这是正确的

根据这个推理,我应该这样称呼它:

 (<$>f) f 4
(<$>f) f 4
这将导致一个整数

否,因为f没有类型a->a->a->b或与之兼容的类型。相反,它的类型是numa=>a->a->a->a->a。也就是说,f接受三个数字并产生一个数字,而我们正在寻找一个函数,它的第一个参数是a->a->a类型的函数

以a->a->a->b函数和a作为参数并返回b的函数

这是正确的

根据这个推理,我应该这样称呼它:

 (<$>f) f 4
(<$>f) f 4
这将导致一个整数

否,因为f没有类型a->a->a->b或与之兼容的类型。相反,它的类型是numa=>a->a->a->a->a。也就是说,f接受三个数字并产生一个数字,而我们正在寻找一个函数,它的第一个参数是a->a->a类型的函数。

第二个参数是g b类型的函数,其中g是任何应用函子

您正在传递f::Num a=>a->a->a->a作为第二个参数。让我们忽略numa上下文以保持简单

因此,我们寻找g,b,使得g=a->a->a->a

让我们以前缀形式写出f的类型:

f :: (->) a ((->) a ((->) a a)) = g b
因此,g=->a和b=->a->a。后者是中缀形式的b=a->a->a

碰巧->a是一个应用程序函子,所以f类型检查。但是请注意,这是在一个完全不同的函子上使用的,而不是您在示例中使用的函子。因此产生了混乱

TL;DR:重载标识符可能以某种意外的方式改变形状以适应其上下文。

将类型为g b的某个参数作为第二个参数,其中g是任何应用函子

您正在传递f::Num a=>a->a->a->a作为第二个参数。让我们忽略numa上下文以保持简单

因此,我们寻找g,b,使得g=a->a->a->a

让我们以前缀形式写出f的类型:

f :: (->) a ((->) a ((->) a a)) = g b
因此,g=->a和b=->a->a。后者是中缀形式的b=a->a->a

碰巧->a是一个应用程序函子,所以f类型检查。但是请注意,这是在一个完全不同的函子上使用的,而不是您在示例中使用的函子。因此产生了混乱


TL;DR:重载标识符可能以某种意想不到的方式改变形状以适应其上下文。您确定对f的类型不感兴趣吗?请注意,f与f相同,即对其第一个参数的部分应用,但f是对其第二个参数的部分应用。运算符只是函子typeclass中fmap的别名。我同意@kosmikus的说法,你可能想尝试:tf,或者可能:tf,这些都是等价的。你们都是绝对正确的,我想要的是f!!!但现在我想知道,为什么我的推理在谈论f时不成立,如何读取它的签名?@Chirlo还有一个函数的函子实例。这就是为什么你会得到奇怪的签名。你确定你对f的类型不感兴趣吗?请注意,f与f相同,即对其第一个参数的部分应用,但f是对其第二个参数的部分应用。运算符只是函子typeclass中fmap的别名。我同意@kosmikus的说法,你可能想尝试:tf,或者可能:tf,这些都是等价的。你们都是绝对正确的,我想要的是f!!!但现在我想知道,为什么我的推理在谈论f时不成立,如何读取它的签名?@Chirlo还有一个函数的函子实例。这就是为什么你会得到奇怪的签名。我明白了,我没有意识到a->a->a本身就是一个函数!例如,f\g->G234满足签名。谢谢我明白了,我没有意识到a->a->a本身就是一个函数!例如,f\g->G234满足签名。谢谢