2012-09-15 5 views
0

약간의 모호한 유형 변수 문제가 있습니다. 나는 haskell을 좋아하지만 이것은 정말로 내가 아직 처리하지 못한 것입니다. 문제는 매우 간단하며 Text.Printf의 printf가 포함됩니다. 문제는 매우 일반적인 것이므로 일부 샘플 코드에서는 단지 다음 샘플 코드를 사용합니다.printf 및 모호한 유형 변수 문제

program = do 
    d <- addd 4 8 
    printf "%d" d 

addd x y = return (x+y) 

물론 printf를 가져 왔습니다. 그러면 컴파일러는 Num과 PrintfArg 사이에 분명하고 모호한 유형 변수 오류를 제공합니다. 나는 올바른 유형의 서명을 어디에 넣어야할지 모릅니다.

답변

2

이 몇 군데가 있습니다 Haskell에 대한 몇 가지 소개 자료를 읽어보십시오 당신은 타입 시그니처를 넣을 수 있습니다. (당신이 서명을 떠날 때 GHC는 추론 무엇을) 가장 일반적인 유형은 거의 항상 (이다) 첫째, addd은의 가장 일반적인 유형이 :

addd :: (Monad m, Num a) => a -> a -> m a 

당신은 제공하여 특정 유형에만 작업이 제한 수 addd 명시 적 타입 서명, 전혀 다형성 인수 예에서되지 않도록 :

addd :: Monad m => Int -> Int -> m Int 
-- or, 
addd :: Monad m => Integer -> Integer -> m Integer 

을 아니면 예를 들어, addd를 호출 할 때, 당신은 입력 타입의 GHC 통지 수 :

d <- addd 4 (8 :: Integer) 

이고 따라서 유형 유추는 4d이 모두 Integer입니다.

마지막으로 d을 입력 할 수 있습니다. 어느 쪽이든 당신은과 같이 (당신이 d 여러 번 사용하는 경우, 당신은 단지 하나의 주석을 필요)를 사용하는 경우 :

{-# LANGUAGE ScopedTypeVariables #-} 

[...] 
add = do 
    (d :: Integer) <- addd 4 8 
+0

덕분에 도움이 많이되었습니다! 그러나 나는 이것이 정말로 추악 해 보인다는 것을 인정해야한다. 그 주위에 더 예쁘지 않니? 또한 또 다른 이해 질문 : 왜 반환 형식의 숫자 값을 가지고 충분하지 않습니다? 나는 왜 haskell에게 Integer에 관해 말해야 만 하는가? –

+2

Ah 나는 d가 Integer 타입이되도록 요구하는 형식을 % d 형식으로 작성했기 때문이라고 본다. –

1

나는 당신의 프로그램에 무엇이 잘못되었는지 설명하려고 노력할 것이다.

  • 형식 서명을 명시 적으로 지정하면 컴파일러가 형식을 추론하고 프로그램을 더 잘 이해할 수 있습니다.
  • addd는 순수한 함수이므로 return을 사용하지 마십시오.
  • 당신이 명령적인 배경에서 오는 것을 기대하지 않은 것을 반환하십시오.
  • 결국 콘솔로 출력하려면 printf이 필요하고 print 또는 putStrLn을 사용하십시오. 유형 (show 인스턴스가 정의 됨)을 string으로 변환하려면 show을 사용하십시오. 여기

는 수정 된 프로그램이 어쨌든

import Text.Printf 

program :: String 
program = do 
    let d = addd 4 8 
    printf "%d" d 

addd :: Int -> Int -> Int 
addd x y = x+y 

당신은 단지

program :: IO() 
program = do 
    print $ addd 4 8 

addd :: Int -> Int -> Int 
addd x y = x+y 

print를 사용하여 작성할 수있다

+0

:

printf "%d" (d :: Integer) 

또는 당신은합니다 (GHC 확장 ScopedTypeVariables 필요)로 설정하면 배경은 화면에서 멋진 표 형식의 출력을 위해 printf를 사용하는 것이 었습니다.기본 인쇄문을 알고 있지만 형식이 약간 뒤떨어져 있습니다. –