2013-11-26 2 views
0

Для этой функции showGame и ожидаемого результата каждый может дать мне руку, чтобы сделать эту работу?Функция игры в Haskell

import System.IO 

type Symbol = Int 

showGame :: [Symbol] => IO() 
showGame xs = 
    let x = mapM_ (replicate '*') xs 
    putStrLn x 

Вывод должен быть:

1: * 
2: ** 
3: *** 

с

[Symbol] = [1,2,3] 
+0

Функции, названные 'show' в Haskell, как правило, предоставляют« String », а не действие IO. Возможно, вы захотите назвать этот 'printGame'. –

ответ

3

После фиксации несколько ошибок в коде мы получаем следующее:

type Symbol = Int 

showGame :: [Symbol] -> IO() 
showGame xs = 
    mapM_ (\x -> putStrLn $ show x ++ ": " ++ replicate x '*') xs 

main = showGame [1..3] 

Выход:

1: * 
2: ** 
3: *** 
+1

Это также хорошее место для использования 'forM' (' mapM' с перевернутыми аргументами), потому что тогда он читается как цикл foreach. –

1

Похоже, что вы хотите:

let x = fmap (flip replicate $ '*') [1,2,3] 
mapM_ putStrLn x 

mapM_ применяет монадическое действие над списком, но отбрасывает результаты. Это то, что вы хотите распечатать, так как нет полезного результата. Однако вы хотите получить результат при создании списков для отображения. Здесь вы можете просто использовать fmap (или map, так как вход представляет собой список), чтобы создать список для каждого элемента списка элементов.

+1

Я бы сказал, что '(\' replicate \ ''*')' значительно читаем, чем эквивалент с 'flip', и на самом деле проще понять (хотя на самом деле он использует более сложные функции языка). – leftaroundabout

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