从Haskell开始,我经常遇到类型问题(而且GHC的错误信息较少)。我定义了以下功能:
ghci> let f x = floor x == x
ghci> :t f
f :: (Integral a, RealFrac a) => a -> Bool
成功,但调用难以接受:
ghci> let a = 1.1
ghci> f a
<interactive>:296:1:
No instance for (Integral Double) arising from a use of `f'
Possible fix: add an instance declaration for (Integral Double)
In the expression: f a
In an equation for `it': it = f a
ghci> let b = 2
ghci> f b
<interactive>:298:1:
No instance for (RealFrac Integer) arising from a use of `f'
Possible fix: add an instance declaration for (RealFrac Integer)
In the expression: f b
In an equation for `it': it = f b
如何正确定义功能?
答案 0 :(得分:4)
Haskell不会在不同的数字类型之间执行任何自动强制,因此,如果您是比较<tr sly-repeat="m in rows"> .....<tr>
然后x == y
和x
必须具有完全相同的类型(例如,两者都是整数或两者都是浮点数。)
现在,如果你看一下y
的类型
floor
这意味着您只能为小数类型调用它,结果类型必须是整数类型。
当您在floor :: (Integral b, RealFrac a) => a -> b
内拨打f 1.1
时,您最终会进行比较
f
但现在你遇到了问题,因为floor 1.1 == 1.1
只能返回整数类型,为了进行比较,结果必须与floor
具有相同的类型,这绝对不是整数。
您需要将1.1
定义为
f
fromIntegral
调用将整数底值强制转换为小数值,以便可以将其与原始let f x = fromIntegral (floor x) == x
进行比较。