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