2016-03-26 44 views
0

'da rastgele bir sayıyı tekrarlayın. Bazı harflerin rasgele tekrarlandığı bir ifadeyi döndürecek bir aptal IRC botu için bir işlev oluşturmaya çalışıyorum. Sorun şu ki, ghc gibi rasgele sayıları kullanmanın bir yolunu bulamıyorum. this answer kullanarak bile kodumun derlenmesini sağlamak için özellikle yararlı görünmüyor. Hatta Int bekliyor ne zaman bir IO Int bulduğu, hala derleme hataları alıyorum bu şekilde bir do bloğunu kullanan ve işlevine IO Int s geçme hile ileHaskell

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 eylemlerini kullandığı için, onun türü' String' değil 'IO String' olmalıdır. Ayrıca, gerekli ithalatları ekleyerek kodunuzu kendi kendine yeterli hale getirin. – Jubobs

+0

@Jubobs Şimdi eklenmiştir. System.Random'un bu örnek için tek ihtiyacım olduğuna inanıyorum (tüm botun kendisi muhtemelen bu soruyla ilgisiz olan bir sürü başka ithalat kullanıyor). – cjm

cevap

2

randomBad O String yazmaktır .... GÇ monad değil, ancak IO String

Değişim bu

randomBad :: String 

bu

randomBad :: IO String 
için bu tip olmak tanımlıyorsanız

Daha sonra bunu ana gibi bir başka IO eyleminde kullanabilmeniz gerekir:

main = do 
    theString <- randomBad 
    putStrLn theString 
+0

Botum, [bu öğreticinin örnek 4'ünde] (https://wiki.haskell.org/Roll_your_own_IRC_bot) kodundaki kodlara dayanıyor ve sanki orada bir sürü şeyi değiştirmem gerekebilir gibi görünüyor (özellikle, 'privsg' işlevi 'IO String's ile başa çıkmak için. Bu doğru mu, yoksa bir çeşit türü değiştirmekten kaçınmak için yapabileceğim başka bir refakat var mı? – cjm

+0

Ben sadece hızlı bir şekilde baktı, ama bu eğitimde IO monad zaten her şey gibi görünüyor, bu yüzden muhtemelen çok değiştirmek zorunda kalmazsınız .... Hile sadece bir IO monad başka bir (ve Yani ana kadar), yani kodun bazı saf kısımları varsa, herhangi bir rasgele jeneratörü kullanamazsınız. – jamshidh

+1

Sadece terminoloji üzerine bir not; 'randomBad'in kendisi IO monadında değil; Bu sadece bir monadik değer döndüren bir işlevdir. Bu işlevler monad içinde "in" olarak kullanılmalıdır, çünkü bir "IO String" değerinden bir "String" çıkarmanın başka bir yolu yoktur. – chepner