我注意到Haskell中有一个模式。通常当我做错事时
[(+3),(-3)] <*> pure 4 :: (Num (b -> b), Num b) => [b]
我知道问题是(-3)
,它应该是(subtract 3)
,但是类型签名似乎首先暗示,你得到一个有效的值,但有一些约束。
Num b
是合乎逻辑的,涉及数学运算。
但这Num (b -> b)
是什么意思?操作b -> b
应该是一个数字?
通常当我注意到这一点时,我可以暗示该声明的进一步论据,并且我得到了良好类型的陈述:
[(+ 3),(- 3)] <*> pure 4 4 4 :: (Num (t -> [b]), Num (b -> b), Num t, Num b) => [b]
这里发生了什么?