對於這個功能,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]
對於這個功能,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]
在你的代碼修復了一些錯誤後,我們得到這個:
type Symbol = Int
showGame :: [Symbol] -> IO()
showGame xs =
mapM_ (\x -> putStrLn $ show x ++ ": " ++ replicate x '*') xs
main = showGame [1..3]
輸出:
1: *
2: **
3: ***
這也是一個使用'forM'('mapM',參數翻轉)的好地方,因爲它讀起來就像是一個foreach循環。 –
它看起來像你想:
let x = fmap (flip replicate $ '*') [1,2,3]
mapM_ putStrLn x
mapM_
在應用列表中的一元行動,但放棄的結果。這是你想要打印的內容,因爲沒有有用的結果。但是,在創建要顯示的列表時,您確實需要一個結果。在這裏,您可以使用fmap
(或map
,因爲輸入是一個列表)爲每個輸入列表元素創建一個列表。
我會說'(\'replicate \''*')'比'flip'具有更好的可讀性,事實上它更容易理解(儘管它實際上使用了更高級的語言功能)。 – leftaroundabout
Haskell中名爲'show'的函數通常提供'String'而不是IO動作。您可能想改爲命名此「printGame」。 –