【问题标题】:Haskell No instance for (Fractional a0) arisingHaskell 没有出现 (Fractional a0) 的实例
【发布时间】:2016-09-05 18:22:57
【问题描述】:

我在 Haskell 中有以下代码:

powmod base 1 m = mod base m
powmod base exp m | even exp  = mod (pow2 * pow2) m
                  | otherwise = mod (base * powmod base (exp - 1) m) m
     where
        pow2 = powmod base (div exp 2) m

part1 j n 0 = 0
part1 j n k = (part1 j n (k-1)) + (powmod 16 (n-k) r)/r
   where
     r = 8*k+j

代码在 ghci 上加载没有任何问题。当我尝试将函数 part1 调用为:

part1 4 10 4

我明白了:

没有因使用it' The type variablea0' 而产生的 (Fractional a0) 实例不明确注意:有几种可能 实例:实例积分 a => 分数 (GHC.Real.Ratio a) -- 在GHC.Real' instance Fractional Double -- Defined inGHC.Float' 实例中定义 Fractional Float -- 在GHC.Float' In the first argument ofprint' 中定义,即'it' 交互式 GHCi 命令:打印它

我不明白这个问题。任何帮助都会很棒。谢谢

【问题讨论】:

    标签: haskell


    【解决方案1】:

    我解决了。我需要一些 fromIntegral 转换。最终代码:

    part1 :: Integer -> Integer -> Integer -> Double
    part1 j n 0 = 0
    part1 j n k =  (part1 j n (k-1)) + (fromIntegral (powmod 16 (n-k) r)) / fromIntegral r
     where
       r = 8*k+j
    

    【讨论】:

      【解决方案2】:

      您的问题是一个非常常见的问题 - 它源于您将 (/)Integral 操作(如 mod 987654326@) - 但是没有基本的数字类型是它们的一个实例 - 所以你最终会遇到 unsolvable 约束,GHC(i) 将找不到匹配的实例并抱怨。

      如果您签名,大部分内容都会变得显而易见 - 是的,您不必这样做,但正如您在此处看到的那样,无论如何这样做都很有价值。

      假设你想在Integer 工作,你会得到这个:

      part1 :: Integer -> Integer -> Integer -> Integer
      part1 j n 0 = 0
      part1 j n k = (part1 j n (k-1)) + (powmod 16 (n-k) r) `div` r
         where
           r = 8*k+j
      

      注意我用div 替换了(/)?只要您包含预期的类型,Haskell 就会向您指出这一点。

      当然要注意

      part1 :: Integral a => a -> a -> a -> a
      

      也可以

      【讨论】:

      • 您好,感谢您的回答,但是如果我真的希望 part1 的返回类型是小数呢?我尝试使用“part1 :: Integer -> Integer -> Integer -> Float”,但 taht 不起作用
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多