2012-10-15 3 views
0

하스켈에서 입력 및 출력을 사용하는 방법을 배우고 있습니다. 임의의 숫자를 생성하여 다른 파일로 출력하려고합니다. 문제는 난수가 "IO int"를 반환하는 것 같아서 "show"를 사용하여 String으로 변환 할 수 없다는 것입니다. 누군가 포인터를 여기 줄 수 있니?Haskell에서 IO int를 String으로 변환하는 방법은 무엇입니까?

+0

이 도움이되지 않는 것입니까? http://stackoverflow.com/a/2784280/1268844 – Anshu

+2

어떤 코드를 시도 했습니까? – kennytm

답변

9

작성한 코드를 표시하는 것이 도움이됩니다.

어쨌든, 당신은 do 블록에 있으며 이런 식으로 작성 했습니까?

main = do 
    ... 
    writeFile "some-file.txt" (show generateRandomNumberSomehow) 
    ... 

대신 같이해야합니다 :

main = do 
    ... 
    randomNumber <- generateRandomNumberSomehow 
    writeFile "some-file.txt" (show randomNumber) 
    ... 

<- 연산자는 왼쪽에 Int -valued 변수에 오른쪽에 IO Int 값의 결과를 결합한다.

이 구문은 do 블록 내부에서만 유효하다 (예,은 등을하는 String -valued 변수에 IO String 값의 결과를 결합하기 위해 사용 가능). do 블록 자체가 IO 값을 생성한다는 점에 유의해야합니다. IO 성능을 멀리 떨어 뜨릴 수는 없습니다.

+0

도움을 주셔서 대단히 감사합니다 !! 나는 이것을 알아 내려고 하루 종일 소비했다. _ _

3

dave4420 님의 답변은 여기에서 원하는 내용입니다. IOMonad이라는 사실을 사용합니다. 그렇기 때문에 do 표기법을 사용할 수 있습니다.

그러나 "실제로는 '열려 있지 않지만 일부 래퍼 내부에있는 값에 함수를 적용하는'개념은 실제로는 IO보다 일반적이고 모나드보다 일반이라는 개념을 언급 할 필요가 있다고 생각합니다. 그것은 우리가 Functor 클래스를 가지고 있습니다. 당신은 몇 가지 값을 가질 때, (이, 예를 들어, Maybe 또는 [] 또는 IO을 할 수있는) 어떤 펑 f를 들어


wrapped :: f t, 당신은 함수 그것에
t -> t'에게 적용 할 fmap을 사용할 수 있습니다 (예를 wrapped :: Maybe Int에 대한) (예 : show :: Int -> String)
wrappedApplied :: f t' (예 : wrappedApplied :: Maybe String)이 표시됩니다. 당신의 예에서

, 그것은

genRandomNumAsString :: IO String 
genRandomNumAsString = fmap show genRandomNumPlain 
+0

내가 추가하고 싶었던 것, 그렇습니다. +1. 'fmap'은'IO'에서 편리합니다. – AndrewC

관련 문제