2013-11-26 116 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

Haskell中名爲'show'的函數通常提供'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