试图了解最终签名是如何推断出来的:
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)
请再次注意,我正在删除右侧的括号,但不是在箭头的左侧.
| 归档时间: |
|
| 查看次数: |
157 次 |
| 最近记录: |