【发布时间】:2017-08-28 16:23:26
【问题描述】:
我在源文件中有以下 Haskell 定义
nNotes=7
pitchLimit k = k < 0 || k > 20
pitcherror = error "Invalid Pitch"
getOctave k
| pitchLimit k = pitcherror
| otherwise = k `div` nNotes
我没有声明getOctave 的类型。现在这是我关于类型的问题。后来在同一个源文件中,我使用了getOctave 和Int。我将源文件加载到 GHCI 中,Haskell 推断getOctave 的类型是Int->Int。现在我注释掉使用getOctave 作为Int 的代码。我重新加载源文件,现在 Haskell 推断 getOctave 的类型为 Integer->Integer。现在在我看来div 的默认值是Integer->Integer。现在我取消注释该代码并将getOctave 的类型指定为(Integral a) => a ->a。 Haskell 报错。使用(Integral a) => a -> a 有什么问题。
【问题讨论】:
-
可能是单态限制的结果。像
x=4这样的非函数绑定只有在没有显式注释的情况下才会被赋予单态类型。 stackoverflow.com/questions/32496864/…