2016-03-26 16 views
0

私は愚かなIRCボットのために関数を作成しようとしていますが、文字の一部がランダムに繰り返されるフレーズを返します。私が持っている問題は、ghcが好きな乱数を使う方法を見つけることができないということです。 this answerを使用しても、自分のコードをコンパイルするのに特に役立たないようです。でもdoブロックを使用して、私はまだIntを期待するとき、それはIO Intを発見したコンパイルエラーを取得しています方法関数にIO Int秒を渡すのトリックと文字をHaskellで無作為に繰り返します。

import System.Random 


-- Write bad 
baaad x y = "B" ++ (repeatA x) ++ "D " ++ (exclaim y) 

-- StartHere  
randomBad :: String 
randomBad = do 
    x <- randomRIO(5,10) :: IO Int 
    y <- randomRIO(0,6) :: IO Int 
    return $ baaad x y 


repeatA :: Int -> String 
repeatA x = rptChr "A" x 

exclaim :: Int -> String 
exclaim x = rptChr "!" x 

rptChr :: String -> Int -> String 
rptChr x y = take y (cycle x) 

+1

'randomBad'はI/Oアクションを使用するので、そのタイプは' String'ではなく 'IO String'でなければなりません。また、必要な輸入品を追加してコードを自己完結型にしてください。 – Jubobs

+0

@Jubobsこれが追加されました。私はこの例では 'System.Random'が必要だと信じています(ボット全体ではおそらくこの質問とは無関係の他のインポートを使用しています)。 – cjm

答えて

2

randomBadはIOモナドではありません....それはStringタイプですが、あなたはそれがこの

randomBad :: IO String 
にこの

randomBad :: String 

タイプIO String

変更する定義されています

次に、メインのような別のIOアクションでこれを使用できるはずです。

+0

私のボットは[このチュートリアルの例4](https://wiki.haskell.org/Roll_your_own_IRC_bot)のコードに基づいており、そこにあるものを一式変更する必要があるようです'privmsg'関数)を使用して' IO String'を処理します。これは本当ですか、それとも他のリファクタリングがありますか? – cjm

+0

私はすぐに見ただけですが、そのチュートリアルではすべてがIOモナドに入っているようですので、多分変更する必要はありません....トリックは、別のIOモナドを使用することができるということですそれでメインになるまで)、あなたがコードの純粋な部分を持っているなら、その中にランダムジェネレータを使用することはできません。 – jamshidh

+1

用語についての注記。 'randomBad'自体はIOモナドにはありません。それは単なる値を返す単なる関数です。このような関数はモナドの "in"で使わなければなりません。なぜなら、 'IO String'値から(例えば)' String'を抽出する他の方法がないからです。 – chepner

関連する問題