我試圖用Haskell實現Cantor配對。整數列表的編碼工作正常,但由於類型錯誤,解碼不起作用。Haskell類型/類型轉換(sqrt,floor)
我試過幾乎所有我能想到的,但沒有什麼會制定出:
cantorDecode :: Integer -> [Integer] -> [Integer]
cantorDecode e zs
| length zs == 0 = cantorDecode y [x,y]
| head zs == 0 = map toInteger $ tail zs
| otherwise = cantorDecode y ((head zs)-1 : (tail zs) ++ [x,y])
where
a = fromRational e
w = floor ((s-1.0)/2.0)
s = fromIntegral $ sqrt(8.0*e+1.0) :: Double
t = fromRational $ (w^2+w)/2.0
y = toInteger $ e - (toInteger $ floor t)
x = toInteger $ (toInteger w) - (toInteger y)
- 輸入下一個整數解碼
- 輸入與已經解碼的整數
正如你所看到的,我使用sqrt
,floor
和其他東西,所以它有點凌亂...
您還應該添加遇到的錯誤。 – Zeta 2014-11-03 09:40:29
我認爲你的問題在這裏:'8.0 * e + 1.0'如果我看到它是正確的'e'是一個整數,所以你不能在這裏使用它 - 應該是這樣的:'8.0 * fromInteral e * 1.0' – Carsten 2014-11-03 09:52:25
next問題同一行 - 'fromIntegral'和無論'sqrt'出現什麼......嘗試'sqrt。 fromlteral $ 8 * e + 1'而不是... – Carsten 2014-11-03 09:54:09