2

我是 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

我完全迷路了,我尝试过搜索,但什么也没找到。谢谢!

4

3 回答 3

9

您可以forM_为此使用:

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

如果你想直接写自己的版本,你会遇到一些问题。

对于空列表,您只需创建一个 的值IO (),您可以使用 return 来完成。

对于要输出该行的非空列表putStrLn,然后处理列表的其余部分。非空列表的形式x:xsx列表的头部和xs尾部。您的第二个模式与单元素列表匹配。

func [] = return ()
func (x:xs) = putStrLn x >> func xs
于 2013-04-01T14:24:45.770 回答
8
func = mapM_ putStrLn

mapM_像列表的每个元素一样应用一元函数putStrLn,并丢弃返回值。

于 2013-04-01T14:25:50.627 回答
7

您实际上并没有尝试打印任何内容,而是使用 putStr 。尝试类似的东西

print [] = return ()
print (x:xs) = do
                 putStr x
                 print xs
于 2013-04-01T14:24:27.193 回答