我在haskell中定义了三个函数,它们乘以两个数字
k = \x y -> x * y
foo y = \x -> x * y
bar x = \x -> x * x
但是我为这三个功能获得了不同的签名。
λ> :t k
k :: Integer -> Integer -> Integer
λ> :t foo
foo :: Num a => a -> a -> a
λ> :t bar
bar :: Num a => t -> a -> a
有人可以解释为什么会这样吗?我可以在酒吧的类型签名中看到。它是否与a,b或a1,a2等的正常使用不同
答案 0 :(得分:6)
首先:所有签名基本上来自(*) :: Num a => a -> a -> a
以及您对它的使用。是的k
和foo
应该是相同的,但bar
确实与您在此处写的有点不同。
foo
应该是显而易见的(我希望)(它只是*
是多态的,类型只是说明了)bar
,因为左侧的x
未在right
方面使用,因此您获得额外参数t
- 它&# 39;与bar y = \x -> x * x
k
请参阅Monomorphism restriction - 基本上Haskell将在此处提取默认类型以解决可能出现的一些轻微问题。你在这里得到它有点奇怪,因为默认情况下较新的GHCi版本不应该显示这种行为(见链接)所学到的教训应该是写下你的签名(至少在顶级函数上)^^ - 它会解决你所有的问题