Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.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 另一种类型的fu-hitch_Haskell - Fatal编程技术网

Haskell 另一种类型的fu-hitch

Haskell 另一种类型的fu-hitch,haskell,Haskell,试图了解最终签名是如何推断的: GHCi> :t (+) (+) :: Num a => a -> a -> a GHCi> :t (<*>) (<*>) :: Applicative f => f (a -> b) -> f a -> f b GHCi> :t (<*>) (+) (<*>) (+) :: Num b => (b -> b) -> b -> b

试图了解最终签名是如何推断的:

GHCi> :t (+)
(+) :: Num a => a -> a -> a
GHCi> :t (<*>)
(<*>) :: Applicative f => f (a -> b) -> f a -> f b
GHCi> :t (<*>) (+)
(<*>) (+) :: Num b => (b -> b) -> b -> b
有人能解释一下如何得到最终的类型吗


谢谢。

您遇到的问题是
->
的正确关联性。考虑<代码> <代码>的类型:

请注意,它从
(r->(a->b))->其他内容
(r->a->b)->其他内容
,而不是
r->(a->b)->其他内容
。我们可以删除内括号,因为它们位于箭头的右侧,但我们不能删除外括号,因为它们位于箭头的左侧

现在,
(+):(numa)=>a->a->a
。当
r
a
b
相同并且它们都是数字时,这与
的第一个参数非常吻合。总之,我们明白了

(<*>) (+) :: (Num a) => (a -> a) -> (a -> a)
          :: (Num a) => (a -> a) -> a -> a
()(+):(numa)=>(a->a)->(a->a)
::(数字a)=>(a->a)->a->a
请再次注意,我正在删除箭头右侧的括号,但没有删除箭头左侧的括号。

因此,如果(+)传递给(),则(r->a->b)对应于Num a'=>a'->a'->a',结果类型为(a'->a'->(a'->a'),即(a'->a'->a'->a'->a',由于右关联性。
<*> :: (Applicative f) => f (a -> b) -> f a -> f b
<*> :: f (a -> b) -> f a -> f b
    :: (r -> (a -> b)) -> (r -> a) -> (r -> b)
    :: (r -> a -> b) -> (r -> a) -> (r -> b) -- This is the key line
(<*>) (+) :: (Num a) => (a -> a) -> (a -> a)
          :: (Num a) => (a -> a) -> a -> a