拥抱类型签名包含额外的类型约束?

Ian*_*nry 5 haskell hugs

在和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中的一个错误吗?

ham*_*mar 7

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)

  • 虽然有点奇怪,因为`(积分a,Num b)=> b - > b`不是明确给出某种东西的有效类型,因为`a`未被使用. (2认同)