另一种类型的故障

Dav*_*ric 5 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
Run Code Online (Sandbox Code Playgroud)

(a' -> a' -> a')必须统一f (a -> b),所以f可能是类型((->) r):

(<*>) :: Applicative ((->) r) => r -> (a -> b) -> (r -> a) -> (r -> b)
(<*>) (+) ~ a' -> (a' -> a') -> (a' -> a') -> (a' -> a')
(<*>) (+) :: (a' -> a') -> (a' -> a') -- ^^^ got stuck here
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释如何获得最终类型?

谢谢.

ger*_*ter 12

你遇到的问题是与正确的关联性->.考虑以下类型<*>:

<*> :: (Applicative f) => f (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)

随着f a等于r -> a,我们有

<*> :: 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
Run Code Online (Sandbox Code Playgroud)

请注意,它从去(r -> (a -> b)) -> other stuff(r -> a -> b) -> other stuff,没有r -> (a -> b) -> other stuff.我们可以删除内括号,因为它们位于箭头的右侧,但我们无法删除外括号,因为它们位于箭头的左侧.

现在,(+) :: (Num a) => a -> a -> a.这与第一个参数完全符合<*>的时候r是一样的a是一样的b,它们都是数字.总之,我们得到了

(<*>) (+) :: (Num a) => (a -> a) -> (a -> a)
          :: (Num a) => (a -> a) -> a -> a
Run Code Online (Sandbox Code Playgroud)

请再次注意,我正在删除右侧的括号,但不是在箭头的左侧.