하스켈을 사용하여 칸토어 페어링을 구현하려고합니다. int리스트의 인코딩은 정상적으로 작동하지만 디코딩은 타입 에러로 인해 작동하지 않습니다. 하스켈 유형/유형 변환 (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
당신의 문제가 여기에 있다고 생각합니다 :'8.0 * e + 1.0'이 맞다면'e'는 정수이므로 여기서는 사용할 수 없습니다 - 다음과 같이'8.0 * fromIntegral e * 1.0' – Carsten
다음과 같이하면됩니다. 문제는 같은 줄 -'fromIntegral'과'sqrt'에서 생긴 것 ...'sqrt를 시도하십시오. fromIntegral $ 8 * e + 1' 대신 ... – Carsten