处理以下错误:
Couldn't match expected type `m0 KAutomat'
with actual type `KAutomat'
In the second argument of `firstFor', namely `ts'
In a stmt of a 'do' block:
tsko <- firstFor (take 1 $ Set.toList $ setW ts) ts
In the expression:
do { tsko <- firstFor (take 1 $ Set.toList $ setW ts) ts;
reduce tsko }
以下是我的代码片段:
reduce ts
| (Set.null (setW ts))==False = do
tsko <- firstFor (take 1 $ Set.toList $ setW ts) ts
reduce tsko
| otherwise = return ts
firstFor x ts = ts
ts
属于KAutomat类型。我相信你没有更多的代码。如果你这样做,请告诉我。
我已经阅读了有关m0
内容的内容,我已经知道它与Monads有关。虽然不知道如何解决这个问题。你可以帮帮我吗?
我实际上要做的是用开头的条件模拟while
周期。我测试集合(setW ts)
是否为空,如果不是,我从中获取第一项并将其与ts一起传递给函数firstFor
。再次 - 直到设置(setW ts)
为空。
答案 0 :(得分:0)
根据您自己的代码
reduce ts
| (Set.null (setW ts))==False = do
tsko <- firstFor (take 1 $ Set.toList $ setW ts) ts
...
firstFor x ts = ts
我们看到firstFor
只是返回第二个参数,所以上面实际上意味着
reduce ts
| (Set.null (setW ts))==False = do
tsko <- ts
...
要从monadic值tsko
中提取ts
,我们需要ts
具有monadic类型,而KAutomat
不是monadic。
你想要达到什么目的? reduce
的预期类型是什么?
您可能需要let tsko = ts
,或者您可能需要删除所有do
,因为您没有处理任何monad,并将其替换为let ... in ...
或类似内容。< / p>
很难从你的问题中说出来。我建议您在为函数编写显式类型签名之前不要为函数编写任何代码,例如
reduce :: KAutomat -> ....
firstFor :: ... -> ... -> ...
这样做通常可以帮助GHC生成更好的类型错误消息。