2013-09-26 3 views
4

에이 코드 작성했습니다되지 않음 :하스켈 가져 오기 오류 : 범위

import GHC.Float                 

next :: GHC.Float -> GHC.Float-> GHC.Float           
next n x = (x + n/x)/2 

을 그리고 나는 다음과 같은 오류가 무엇입니까 : 문제없이

numerical.hs:3:9: 
    Not in scope: type constructor or class `GHC.Float' 

numerical.hs:3:22: 
    Not in scope: type constructor or class `GHC.Float' 

numerical.hs:3:34: 
    Not in scope: type constructor or class `GHC.Float' 

모듈 수입, 그래서 나는 아니에요 틀린 이름으로 참조하고 있거나 표준 Float 모듈이 IEEE GHC.Float 모듈과 동일하고 명시 적으로 가져올 필요가없는 경우에도 그렇습니다.

import GHC.Float as Fl을 시도했지만 성공하지 못했습니다. Fl에서 같은 유형의 오류가 발생했습니다.

나는 분명히 하스켈을 시작 했으므로 어떤 도움도 받으실 수 있습니다!

+0

는'GHC.Float'은 모듈의 이름입니다, 그것은 형식 이름 대신 사용할 수 없습니다. 'GHC.Float.Float'는 사용할 수있는 타입의 이름입니다.하지만 아래의 답변에서 볼 수 있듯이, 이것은 중복되어 있습니다. –

답변

5

방금 ​​GHC는 암시 적으로 당신이 가진 모든 소스 파일에 Prelude라는 모듈을 수입 그래서

next :: Float -> Float -> Float 
next n x = (x + n/x)/2 

처럼 Float을 쓸 수 있습니다, 수동 GHC.Float를 가져올 필요가 없습니다. Prelude에는 언어의 "기본 제공"으로 사용되는 많은 유용한 유형, 기능 및 기타 요소가 포함되어 있습니다. Int, Float, Maybe, IO과 같은 유형이 있으며 head, +, / 등과 같은 기능이 있습니다.


당신은 부동 소수점 수는 GHC.Float 모듈에서 기능 isIEEE과 IEEE 부동 소수점이 있는지 확인하기 위해 테스트 할 수 있습니다

:이를 실행하면

import GHC.Float 

main = do 
    putStr "1.0 is an IEEE floating point: " 
    print $ isIEEE (1.0 :: Float) 

, 그것을 인쇄 할 True


내가 코드를 더 일찍 컴파일하지 않은 이유는 단지로 모듈을 가져올 때, 그 모든 것이 범위에 포함됩니다. 당신은 import qualified를 사용하여이 자격을 강제 할 수 있습니다, 여기에 몇 가지 예입니다 :

import GHC.Float -- Everything now in scope 
import qualified Data.Maybe -- Have to use full name 
import qualified Data.List as L -- aliased to L 

main = do 
    -- Don't have to type GHC.Float.isIEEE 
    print $ isIEEE (1.0 :: Float) 
    -- Have to use full name 
    print $ Data.Maybe.isJust $ Nothing 
    -- Uses aliased name 
    print $ L.sort [1, 4, 2, 5, 3] 
+0

표준 모듈은 IEEE 부동 소수점 표준을 사용합니까? – marsella

+0

@ marsella 몇 줄이 걸리므로 이것을 테스트하는 방법에 대한 예제 코드를 보여줄 내 대답을 편집하겠습니다. – bheklilr

+0

@marsella 완료, 내 대답 편집 내용보기 – bheklilr