在和Haskell一起玩的时候碰到了这个,我很难过:
Hugs> :type (\x -> x^2)
\x -> x ^ 2 :: (Integral a, Num b) => b -> b
Run Code Online (Sandbox Code Playgroud)
a在那做什么?我怎么读这个?如果我在GHCi中键入相同的内容,它会为我提供我期望的输出:
Prelude> :type (\x -> x^2)
(\x -> x^2) :: Num a => a -> a
Run Code Online (Sandbox Code Playgroud)
这是Hugs中的一个错误吗?
该Integral约束来自于指数2.请记住,在Haskell中,整数文字实际上是类型的多态值Num a => a.编译器然后推断,因为它被用作指数(^) :: (Num a, Integral b) => a -> b -> a,它必须是更受约束的类型Integral a => a.
为了避免在代码中消除数字文字的歧义,Haskell使用类型默认为任何无约束的数字类型选择合理的具体类型.在这种情况下,那将是Integer.差异似乎是:type在Hugs报告此前发生的推断类型,而GHCi报告类型默认后应用类型.
如果您自己为指数指定具体类型,则额外约束将消失.
Hugs> :type (\x -> x^(2 :: Integer))
\x -> x ^ 2 :: Num a => a -> a
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
140 次 |
| 最近记录: |