Haskell:IO [String]到[String]

时间:2016-01-03 14:00:49

标签: haskell io

现在这是一个已经通过stackoverflow的线程,这也被其他网站所覆盖,但我仍然无法完全绕过它。我已经从这个网站上阅读了不同的内容,我将它们链接在底部,但现在是问题。

像往常一样,我试图从文件中读取行:

readTable = do
  s <- readFile "projekt-board.txt"
  let content = lines s
  let removeEnd = init(content)
  let removeHead = tail(removeEnd)
  return removeHead

printTable [] = putStr ""
printTable [x] = putStrLn x
printTable (x:xs) = do
  let element = x
  putStrLn element
  printTable xs

我无法理解为什么我不能获得IO [String] - &gt;函数readTable中的[String]异常,但是使用readTable参数调用printTable会给我一个错误。

有没有办法在IO [String]类型中恶作剧,可能是通过访问IO [String]列表中的每个元素,然后创建一个新的纯元素?或者我仍然可以使用IO [String]类型执行基本列表操作(但是到目前为止我已经失败了。)

我阅读的一些阅读资料让我更加困惑:

The IO Monad for people who simply don't care

How can i parse IO string in haskell (stackoverflow)

A gentle introduction to Haskell

Haskell IO from Haskell Wiki

编辑:

呼出时抛出错误:

printTable readTable

Couldn't match expected type `[String]'
            with actual type `IO [String]'
In the first argument of `printTable', namely `readTable'
In the expression: printTable readTable
In an equation for `it': it = printTable readTable

1 个答案:

答案 0 :(得分:2)

只需使用<{1}} printTable - 块中的do 来处理readTable生成的字符串:

readTable = do
  s <- readFile "projekt-board.txt"
  let content = lines s
  let removeEnd = init(content)
  let removeHead = tail(removeEnd)
  printTable removeHead

你无法从IO monad do获得纯粹的价值 - 阻挡进入纯粹的Haskell世界;但你不需要。

IO do - 块中的每一行必须具有相同的类型,IO a - a当然可能有所不同,但它必须具有相同的格式{{1} }。 IO a块中最后一行的类型是do块的整体类型。例如,

do

所以,

 #> :t putStr ""
putStr "" :: IO ()

适合。