Haskell:没有出现任何实例

时间:2015-05-31 16:46:07

标签: haskell types

从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

如何正确定义功能?

1 个答案:

答案 0 :(得分:4)

Haskell不会在不同的数字类型之间执行任何自动强制,因此,如果您是比较<tr sly-repeat="m in rows"> .....<tr> 然后x == yx必须具有完全相同的类型(例如,两者都是整数或两者都是浮点数。)

现在,如果你看一下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 进行比较。