我的目标是编写Haskell函数,它从输入中读取N行并将它们连接成一个字符串.以下是第一次尝试:
readNLines :: Int -> IO String
readNLines n = do
let rows = replicate n getLine
let rowsAsString = foldl ++ [] rows
return rowsAsString
Run Code Online (Sandbox Code Playgroud)
这里有一些投诉foldl:
无法匹配预期类型
[a]' against inferred type(a1 - > b - > a1) - > a1 - > [b] - > a1'
据我所知,行的类型是[IO String],有可能一些如何加入这样的列表IO String?
除了ephemient指出的,我认为你有一个语法问题:你使用++运算符的方式使它看起来像你试图++用操作数foldl和调用操作符[].将++操作符放在括号中以使您的意图清晰:
foldl (++) [] rows
Run Code Online (Sandbox Code Playgroud)
您正在寻找的功能是sequence,但应该注意
sequence (replicate n f)
Run Code Online (Sandbox Code Playgroud)
是相同的
replicateM n f
Run Code Online (Sandbox Code Playgroud)
而且foldl (++) []相当于concat.所以你的功能是:
readNLines n = liftM concat (replicateM n getLine)
Run Code Online (Sandbox Code Playgroud)
或者,如果您想保留换行符:
readNLines n = liftM unlines (replicateM n getLine)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3066 次 |
| 最近记录: |