0

Haskellで入力と出力を使うことを学んでいます。乱数を生成して別のファイルに出力しようとしています。問題は、乱数がを返しているように見えることです。これは、 usingIO Intに変換できません。Stringshow

誰かが私にここにポインタを教えてもらえますか?

4

2 に答える 2

10

あなたが書いたコードが機能していないことを私たちに見せてくれると役に立ちます。

とにかく、あなたはdoブロックにいて、このようなものを書いていますね?

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

代わりに、次のようなことを行う必要があります。

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

<-演算子はIO Int、右側の値の結果を左側の-valuedInt変数にバインドします。(はい、これを使用して、値の結果をIO StringString付き変数などにバインドすることもできます。)

doこの構文は、ブロック内でのみ有効です。ブロック自体がIO値になることに注意することが重要doです---IO性を洗い流すことはできません。

于 2012-10-15T09:38:19.817 に答える
5

dave4420の答えは、ここで必要なものです。それはであるという事実を使用しIOますMonad; doそのため、表記を使用できます。

IOただし、「関数を「オープン」ではなく、ラッパー内の値に適用する」という概念は、実際にはモナドよりも一般的であり、より一般的であることに言及する価値があると思います。それが私たちのFunctorクラスの目的です。

任意のファンクターf(たとえば、Maybeまたは[]またはIO)の場合、何らかの値
wrapped :: f t(たとえばwrapped :: Maybe Int)がある場合、それを使用fmapして関数
t -> t'を適用し(のように)、(のように)show :: Int -> Stringを取得できます。
wrappedApplied :: f t'wrappedApplied :: Maybe String

あなたの例では、

genRandomNumAsString :: IO String
genRandomNumAsString = fmap show genRandomNumPlain
于 2012-10-15T10:48:33.113 に答える