2013-04-01 87 views
2

我是Haskell的新手,我試圖從輸入中獲取一個值列表,並從列表的每一行中打印出一個項目。Haskell:[字符串]到IO()

func :: [String] -> IO() 

我有麻煩試圖找出如何在清單打印出來的項目,當列表大小剛好1

func [] = return() 
func [x] = return x 

我正在試圖編譯時此錯誤消息該文件:

Couldn't match expected type `()' with actual type `String' 
    In the first argument of `return', namely `x' 
    In the expression: return x 

我完全失去了,我試過搜索,但沒有找到任何東西。謝謝!

+2

如果你只是'返回'一個值,你實際上並不打印任何東西。你需要一個像'putStrLn'這樣的函數。 –

回答

9

您可以使用forM_此:

func :: [String] -> IO() 
func l = forM_ l putStrLn 

如果你想編寫自己的版本直接,你有一些問題。

對於空列表,您無權做任何事情,但創建一個值爲IO(),您可以使用return來完成。

對於非空列表,您希望輸出行putStrLn,然後處理列表的其餘部分。非空列表的形式爲x:xs,其中x是列表的頭部,xs的尾部。你的第二個模式匹配單元素列表。

func [] = return() 
func (x:xs) = putStrLn x >> func xs 
+0

如果您更喜歡['摺紙編程'](http://www.cs.ox.ac.uk/jeremy.gibbons/publications/origami.pdf)風格,你的第二個實現可以寫成'foldr(\ sm - > putStrLn s >> m)(return())',或者甚至是'foldr((>>)。putStrLn)(return())',我認爲它很漂亮:) –

7

你實際上並沒有試圖打印任何東西,你使用putStr。 嘗試類似

print [] = return() 
print (x:xs) = do 
       putStr x 
       print xs 
+0

謝謝。這實際上很有意義。 :) – user1798403

+1

請注意Prelude中已經有一個名爲'print'的函數:http://hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html#v:print – stusmith

8
func = mapM_ putStrLn 

mapM_應用於像putStrLn一個monadic函數到列表中的每個元素,並丟棄返回值。