Haskellで入力と出力を使うことを学んでいます。乱数を生成して別のファイルに出力しようとしています。問題は、乱数がを返しているように見えることです。これは、 usingIO Int
に変換できません。String
show
誰かが私にここにポインタを教えてもらえますか?
あなたが書いたコードが機能していないことを私たちに見せてくれると役に立ちます。
とにかく、あなたは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