下列程式码会因为这个错误而失败。
第一个
我的问题是,为什么loopStage函数需要一个IO值?它被明确地标记为Octopus。
我尝试删除迭代,这使得错误消息更加明确。
main.hs:30:5: error:
• Couldn't match type ‘[]’ with ‘IO’
Expected: IO [Octopus]
Actual: [[Octopus]]
经过进一步的调试,似乎错误出在函数的返回类型上,它返回的是一个非IO的Octopus matrix版本?这是我第一次写Haskell。我试着用IO Package 所有的返回值,但是没有找到解决办法
1条答案
按热度按时间i5desfxk1#
我的问题是,为什么
loopStage
函数需要一个IO
值?它被清楚地标记为[[Octopus]]
。实际上,
loopStage
函数不需要IO
。问题出在别处。让我们把注意力集中在这些线条上。
在这个
do
区块中,readFile
会传回IO
内的值。因此,Haskell推断iterate loopStage octopusMatrix !! 100
必须有IO something
型别。现在,让我们看看
iterate
多态类型:的结果类型
必须是
a
([a]
的元素类型,由'iterate返回)。因此,我们必须有因此,我们期待
其处理
loopStage
的实际类型:请注意,GHC错误消息的确切含义是:
这意味着“您正试图将类型为
[[Octopus]] -> [[Octopus]]
的loopStage
传递给函数(iterate
),而该函数要求的类型为IO a0 -> IO a0
“。如何解决这个问题?必须避免试图“运行”
iterate
的结果,就好像它是一个IO操作: