gpt4 book ai didi

haskell - 另一个类型的故障

转载 作者:行者123 更新时间:2023-12-03 14:31:08 24 4
gpt4 key购买 nike

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

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
(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

有人可以解释如何获得最终类型吗?

谢谢。

最佳答案

您遇到的问题是 -> 的正确结合性.考虑 <*> 的类型:

<*> :: (Applicative f) => f (a -> b) -> f a -> f b

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

请注意,它来自 (r -> (a -> b)) -> other stuff(r -> a -> b) -> other stuff ,不是 r -> (a -> b) -> other stuff .我们可以去掉内括号,因为它们在箭头的右边,但是我们不能去掉外括号,因为它们在箭头的左边。

现在, (+) :: (Num a) => a -> a -> a .这完全符合 <*> 的第一个参数当 ra 相同与 b 相同他们都是数字。总之,我们明白了
(<*>) (+) :: (Num a) => (a -> a) -> (a -> a)
:: (Num a) => (a -> a) -> a -> a

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

关于haskell - 另一个类型的故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12078346/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com