2016-03-26 3 views
0

Я пытаюсь создать функцию для глупых ботов IRC, которые вернут фразу, где некоторые буквы повторяются случайным числом раз. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу найти способ использовать случайные числа, которые нравится ghc. Похоже, что даже использование this answer не особенно полезно для компиляции моего кода.Повторите символ случайное число раз в 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) 

Даже с трюком использования do блока и передавая IO Int S функции таким образом, я все еще получаю ошибку компиляции, что он нашел в IO Int когда ожидается Int.

+1

Поскольку 'randomBad' использует операции ввода-вывода, его тип должен быть' IO String', а не 'String'. Кроме того, сделайте свой код самодостаточным, добавив требуемый импорт. – Jubobs

+0

@Jubobs Теперь добавлено. Я считаю, что «System.Random» - это все, что мне нужно для этого примера (весь сам бот использует кучу других импортов, которые, вероятно, не имеют отношения к этому вопросу). – cjm

ответ

2

randomBad не в монаде IO .... Это типа String, но вы определяете, что это тип IO String

Изменить этот

randomBad :: String 

этому

randomBad :: IO String 

Затем вы должны использовать это в другом действии ввода-вывода, например, main:

main = do 
    theString <- randomBad 
    putStrLn theString 
+0

Мой бот основан на коде в [примере 4 этого урока] (https://wiki.haskell.org/Roll_your_own_IRC_bot), и похоже, что мне может понадобиться изменить целую кучу вещей там (в частности, 'privmsg') для работы с' IO String'. Верно ли это, или есть ли какой-то другой рефакторинг, который я могу сделать, чтобы не менять группу типов? – cjm

+0

Я просто быстро посмотрел, но похоже, что в этом учебнике все уже есть в монаде IO, поэтому вам, вероятно, не придется сильно меняться ... Фокус в том, что вы можете использовать только одну монашку IO в другой (и так и до основного), поэтому, если у вас есть чистая часть кода, вы не сможете использовать в нем какой-либо случайный генератор. – jamshidh

+1

Просто примечание по терминологии; 'randomBad' сам не находится в монаде IO; это просто функция, которая возвращает монадическое значение. Такие функции должны использоваться «в» монаде, поскольку нет другого способа извлечь (например) «String» из значения «IO String». – chepner

Смежные вопросы