2017-09-07 1 views
1

나는 GHC로 컴파일 한 후에 실행될 때 일관되게 멈추는 것처럼 보이는 다음 코드를 가지고있다. (빌드 실패는 -Werror이 아니다.).하스켈이 전화 번호 변환에 걸려있다.

import Data.Aeson 
import Data.Scientific 
import qualified Data.HashMap.Strict as S 

myObj = Object $ 
    S.fromList [("bla", Number $ pc * 100.0)] 
    where pc = 10/9 

myObj에 액세스하려고하면 프로그램이 중단됩니다. 어떤 파기 후에는 haskell이 숫자 변환 (비록 위의 스 니펫과 함께 경고 또는 오류는 없음)으로 힘든 시간을 보내는 것처럼 보입니다. 위의 910으로 변경하면 중단되지 않습니다. 그러나 나는 이상하게 여기는 이유가 궁금합니다.

답변

5

10 % 9 (a Rational)에서 Scientific으로의 변환은 종결되지 않습니다.

10/9 :: Scientific 

From the documentation of Data.Scientific :

WARNING : 과학은 소수의 예이지만, 방법 부분적으로 만 정의된다! 특히 출력이 자릿수 확장 인 경우 (즉, 루프하고 모든 공간을 사용)을 조정하고 /는 분기합니다. Rational 입력 인 Rational 에 무한 십 진법 확장이있을 때 fromRational은 분기됩니다. 반복을 감지하고 시작하는 을 나타내는 이러한 통계에 대해 fromRationalRepetend 을 사용하는 것이 좋습니다.

따라서, 대신이 시도 : 당신은 조치가 적절할지 결정해야합니다

let Right (x, _) = fromRationalRepetend Nothing (10/9) in x 

. 나는 여기에 Left의 가능성을 무시하기로 결정했다.

+0

솔직히 말해서 매우 중요합니다. 분자 및 분모가 사용자 입력에서 오는 실제 응용 프로그램에서이 경우는 요청의 일부에만 표시되어 디버그하기가 매우 어렵습니다. 일반적인 조언은 Data.Scientific을 전혀 피해야하며 숫자를 JSON으로 변환 할 때만 사용하는 것이 좋습니다. – pretobomba