代码之家  ›  专栏  ›  技术社区  ›  danatel

没有(浮点int)的实例

  •  8
  • danatel  · 技术社区  · 15 年前

    我在学哈斯克尔。我已经创建了一个函数,它在基“b”中返回最多为“n”的乘法表。数字被填充成“W”数字。最后一步,我要自动计算“w”。为什么不编译?

    -- Number of digits needed for the multiplication table n*n in base 'base'
    nOfDg :: Int -> Int-> Int 
    nOfDg n base = 1 + floor ( logBase base (n*n)) 
    

    错误:

    No instance for (Floating Int)
         arising from a use of `logBase' at C:\haskel\dgnum.hs:4:24-38
       Possible fix: add an instance declaration for (Floating Int)
       In the first argument of `floor', namely `(logBase b (n * n))'
       In the second argument of `(+)', namely `floor (logBase b (n * n))'
       In the expression: 1 + floor (logBase b (n * n))
    
    3 回复  |  直到 14 年前
        1
  •  11
  •   maxaposteriori    15 年前

    logbase接受两个实现浮动类型类的参数。在将参数传递到logbase之前,您需要调用fromintegral。这是我用6.10.3编译的:

    nOfDg :: Int -> Int-> Int
    nOfDg n base = 1 + floor ( logBase (fromIntegral base) (fromIntegral (n*n)))
    

    您必须记住haskell是非常强类型的,所以您不能仅仅假设提供给函数的int参数将自动强制为日志函数通常采用的浮点数。

        2
  •  5
  •   Dan Dyer    15 年前

    logBase 声明为对浮点类型有效。int不是浮点类型,并且 no automatic conversion in Haskell . 试试这个:

    -- Number of digits needed for the multiplication table n*n in base 'base'
    nOfDg :: Int -> Float -> Int
    nOfDg n base = 1 + floor (logBase base (fromIntegral (n*n)))
    
        3
  •  3
  •   Raoul Supercopter    15 年前

    从序曲:

    logBase :: Floating a => a -> a -> a
    

    这意味着使用logbase时必须使用浮动类型。但int不是浮点类型,也没有自动转换数值类型,因此必须将其从int转换为浮点类型:

    nOfDg n base = 1 + floor ( logBase (toEnum base) (toEnum n))
    

    toenum函数以int作为参数并返回“enum”类型。好的部分是float是枚举的一个实例,因此可以使用它

    toEnum :: Enum a => Int -> a
    

    您应该阅读/记录haskell中关于数字类型(num、fractional、integral、floating…)的标准类型类,因为它们经常出现在代码中,学习转换可能很有用。

    编辑:这个 Haskell Wiki Book 提供标准类型类(包括数字类型)之间关系的非常有用的图形。