无法匹配期望的类型`m0 ...'

时间:2018-03-29 17:05:01

标签: haskell

处理以下错误:

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)为空。

1 个答案:

答案 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生成更好的类型错误消息。