gpt4 book ai didi

Haskell 无限类型

转载 作者:行者123 更新时间:2023-12-04 19:10:42 25 4
gpt4 key购买 nike

我正在尝试使下面的代码正常工作。这是一个有限状态机,我在其中传递一个函数作为下一个状态。使用 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 包装类型。 .但我无法弄清楚如何完成这项工作。

有人可以指出洞察力吗?

最佳答案

我认为这就是你想要的:

newtype F m = F { unF :: String -> m ([String], F m) }

fsm :: (Monad m) => F m -> [String] -> m [String]
fsm f [] = return []
fsm f (r:rs) = do
(xs, f') <- unF f r
rest <- fsm f' rs
return $ xs ++ rest

你是对的,你需要使用 datanewtype任何时候你想要一个递归类型。

在回复您的评论时,您将如何实现 dup功能:
dup :: (Monad m) => F m
dup = F dup' where dup' xs = return ([xs, xs], F dup')

...或者,如果您愿意,也可以将其拆分为两个单独的定义。

请注意,如果您不确定类型签名应该是什么,只需启用 NoMonomorphismRestriction扩展名,编译器不会提示并为您正确推断顶级类型。

关于Haskell 无限类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15488992/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com