haskell中的mod函数和类型类

时间:2013-01-27 14:35:38

标签: haskell types typeclass

我在haskell中有这行代码,其中level :: Floaty :: Int

mod (floor(fromIntegral y + (level/2))) (floor level)

和ghci返回以下内容:

No instance for (Integral Float)
  arising from a use of `mod'
Possible fix: add an instance declaration for (Integral Float)

我尝试使用fromIntegral和floor的几个版本,例如

mod (( y + (floor $ level/2))) (floor level) 

我尝试将level/2转换为积分,但总是返回相同的答案

我知道我必须给mod两个积分参数,所以我无法弄清楚代码错误的原因......

1 个答案:

答案 0 :(得分:3)

使用level :: Floaty :: Int

mod (floor(fromIntegral y + (level/2))) (floor level)

有效并生成调用者想要的任何Integral类型。

Prelude> let level = pi :: Float
Prelude> let y = length "foobar"
Prelude> mod (floor(fromIntegral y + (level/2))) (floor level) :: Integer
1

因此错误

No instance for (Integral Float)
  arising from a use of `mod'
Possible fix: add an instance declaration for (Integral Float)

表示您尝试将结果用作Float

也许你想要

fromIntegral $ mod (floor(fromIntegral y + (level/2))) (floor level)

或者您可能需要更改调用上下文以使用Integral类型。