Haskell将[IO String]加入IO String的方法

Pet*_*pov 4 io monads haskell

我的目标是编写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

Dan*_*att 6

除了ephemient指出的,我认为你有一个语法问题:你使用++运算符的方式使它看起来像你试图++用操作数foldl和调用操作符[].将++操作符放在括号中以使您的意图清晰:

foldl (++) [] rows
Run Code Online (Sandbox Code Playgroud)


Has*_*ant 5

您正在寻找的功能是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)