2016-05-10 27 views
0

我在Haskell下面的代碼:哈斯克爾不負任何實例(分數A0)

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 4 10 4 

我得到:

沒有實例從使用it' The type variable A0' 而產生的(分數A0)是不明確的說明:有幾個潛在的 實例:實例積分a =>分數(GHC.Real.Ratio a) - 定義於GHC.Real' instance Fractional Double -- Defined in GHC.Float實例分數浮點數 - 定義於GHC.Float' In the first argument of print',即`it'在 互動GHCi指令:打印

我不明白這個問題。任何幫助都會很棒。由於

回答

3

這裏你的問題是一個很常見的一個 - 它的根放入你混合(/)Integral操作,如mod - 這將導致兩個約束:一個用於Integral和一個用於Fractional(在(/)) - 但沒有基本的數類型,這是他們兩個的實例 - 所以你最終與無法解決約束和GHC(我)不會找到匹配的實例和抱怨。

如果您簽名的話,大多數情況會變得很明顯 - 是的,您不必如此,但正如您在此處看到的那樣,無論如何都是有價值的。

假設你想在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 

也能發揮作用

+0

嗨,感謝您的回答,但是如果我真的希望part1的返回類型是分數?我試過用「part1 :: Integer - > Integer - > Integer - > Float」但沒有工作 – Kabal

0

我解決它。我需要一些從整體轉換。最終代碼:

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