【发布时间】:2016-01-03 14:00:48
【问题描述】:
现在,这是一个经常经历 Stack Overflow 的线程。这也被其他网站所覆盖,但我仍然无法完全理解它。我从这个网站上读过不同的东西,我在底部链接它们,但现在是问题。
像往常一样,我正在尝试从文件中读取行:
module BoardData where
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
我无法理解为什么我在函数 readTable 中没有得到 IO [String] -> [String] 异常,但是用 readTable 的参数调用 printTable 会给我一个错误。
- 有没有办法欺骗
IO [String]类型,可能是通过访问IO [String]列表中的每个元素,然后创建一个新的纯元素? - 或者我仍然可以使用
IO [String]类型进行基本的列表操作(但是到目前为止我已经失败了)?
我读过的一些阅读材料,但现在让我更加困惑:
- The
IOMonad for people who simply don't care - How can I parse
IO Stringin Haskell (Stack Overflow) - A Gentle Introduction to Haskell:
IO - Programming Haskell: String I/O (Haskell Wiki)
[编辑:调用时抛出错误 ]
*BoardData> let it = printTable readTable in it
<interactive>:1:21: error:
• 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
【问题讨论】:
-
你想要
readTable >>= printTable