我在 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
有人能解释一下为什么会这样吗?我可以在 bar 的类型签名中看到 t 。它与正常使用 a、b 或 a1、a2 等有什么不同
最佳答案
首先:所有签名基本上都来自 (*)::Num a => a -> a -> a
以及您对它的使用。是的,k
和 foo
应该是相同的,但是 bar
确实与您在此处编写的有所不同。
foo
应该是显而易见的(我希望)(只是*
是多态的,并且类型说明了这一点)- 对于
bar
来说,这是因为左侧的x
在右侧
上没有使用,所以你得到了额外的参数t
- 与bar y =\x -> x * x
相同
- 对于
k
,请参阅 Monomorphism restriction - 基本上 Haskell 会在此处拉出默认类型来解决可能出现的一些小问题。你在这里得到它有点奇怪,因为默认情况下较新的 GHCi 版本不应显示此行为(请参阅链接)
顺便说一句:不要对类型的名称太好奇;)
吸取的教训可能应该是写下你的签名(至少在顶级函数上)^^ - 它会解决你所有的问题
关于haskell - Haskell 中函数的类型签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35251072/