现在这是一个已经通过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
编辑:
呼出时抛出错误:
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
答案 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 ()
适合。