【发布时间】:2019-09-23 23:59:47
【问题描述】:
我正在尝试使用 Points(我创建的一种数据类型)创建一个列表,其想法是在每次迭代中添加一个元素。出了点问题。
我试图将p 排除在myLoop 之外,但它似乎也不起作用。
main = myLoop
myLoop = do
let p = []
done <- isEOF
if done
then putStrLn ""
else do inp <- getLine
let (label:coord) = words inp
p ++ [Point label (map getFloat coord)]
-- print (pointerList)
myLoop
我得到这个输出
trabalho.hs:30:23: error:
• Couldn't match type ‘[]’ with ‘IO’
Expected type: IO Point
Actual type: [Point]
• In a stmt of a 'do' block:
p ++ [Point label (map getFloat coord)]
In the expression:
do inp <- getLine
let (label : coord) = words inp
p ++ [Point label (map getFloat coord)]
myLoop
In a stmt of a 'do' block:
if done then
putStrLn ""
else
do inp <- getLine
let (label : coord) = ...
p ++ [Point label (map getFloat coord)]
....
|
30 | p ++ [Point label (map getFloat coord)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
【问题讨论】:
-
Haskell 中的变量是不可变的。您不能在程序运行期间更改它们的值。请改用递归。
-
p ++ […]不会改变p。它创建一个新列表。而且因为这发生在返回类型为IO的do块中,编译器抱怨它是一个列表而不是一个IO 操作。给myLoop一个列表参数,最初使用main中的空列表调用它,并在将新列表传递给递归调用之前附加到它。
标签: list haskell type-mismatch io-monad do-notation