【发布时间】:2013-03-19 08:44:45
【问题描述】:
我正在尝试使下面的代码正常工作。这是一个有限状态机,我在其中传递一个函数作为下一个状态。该函数使用r 调用并返回结果列表+ 下一个函数作为下一个状态。继续调用直到列表用完,并返回结果的串联。 monad 是一个错误 monad,允许我在需要时抛出错误。
fsm f [] = return []
fsm f (r:rs) = do
(xs, f') <- f r
rest <- fsm f' rs
return $ xs ++ rest
错误是:
Occurs check: cannot construct the infinite type: t1 = t0 -> m0 ([a0], t1)
In the first argument of `fsm', namely f'
我以前见过无限类型错误,我理解解决它的方法是用newtype 包装一个类型。但我无法弄清楚如何完成这项工作。
有人可以指出其中的见解吗?
【问题讨论】:
-
f的类型是什么?你能写下来吗? -
它将是
f :: String -> m ([String], t),其中t将是f的类型。我明白这就是为什么它是无限类型但无法弄清楚如何正确包装它的原因。