Haskellで入力と出力を使うことを学んでいます。乱数を生成して別のファイルに出力しようとしています。問題は、乱数がを返しているように見えることです。これは、 usingIO Intに変換できません。Stringshow
誰かが私にここにポインタを教えてもらえますか?
あなたが書いたコードが機能していないことを私たちに見せてくれると役に立ちます。
とにかく、あなたはdoブロックにいて、このようなものを書いていますね?
main = do
...
writeFile "some-file.txt" (show generateRandomNumberSomehow)
...
代わりに、次のようなことを行う必要があります。
main = do
...
randomNumber <- generateRandomNumberSomehow
writeFile "some-file.txt" (show randomNumber)
...
<-演算子はIO Int、右側の値の結果を左側の-valuedInt変数にバインドします。(はい、これを使用して、値の結果をIO String値String付き変数などにバインドすることもできます。)
doこの構文は、ブロック内でのみ有効です。ブロック自体がIO値になることに注意することが重要doです---IO性を洗い流すことはできません。
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