Haskell:[String]到IO()

时间:2013-04-01 14:16:34

标签: haskell io

我是Haskell的新手,我正在尝试从输入中获取值列表,并从每行的列表中打印出一个项目。

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

我完全失去了,我尝试过搜索但没找到任何东西。谢谢!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:8)

func = mapM_ putStrLn

mapM_putStrLn等monadic函数应用于列表的每个元素,并丢弃返回值。

答案 2 :(得分:7)

你实际上并没有尝试打印任何东西,你使用putStr。 尝试像

这样的东西
print [] = return ()
print (x:xs) = do
                 putStr x
                 print xs