gpt4 book ai didi

haskell - 使用自由 Monad 的发散

转载 作者:行者123 更新时间:2023-12-02 11:13:14 24 4
gpt4 key购买 nike

我正在尝试使用数据类型点菜方法来定义用于模板目的的免费 monad。我写了一些组合器,但我被困住了。我的程序不断出现分歧,我不明白为什么。

考虑:

math :: Math :<: f => MathExpr a -> Free f ()
blank :: f :<: (Textual :+: Math) => Free f () -> Free (Blank k f) ()
equals :: Free (Math :+: (Blank L Math)) ()
-> Free (Math :+: (Blank R Math)) ()
-> Free Equation ()

组合(空白.数学)具有类型:

blank . math :: ( f :<: (Textual :+: Math)
, Math :<: f
) => MathExpr a -> Free (Blank k f) ()

请注意,f 必须同时小于 Textual 和 Math 的连接,并且大于 Math。所以 f 的唯一可能是数学。 (我意识到如果我没有做更多的工作,编译器就无法推断出这一点,如果有的话)

当我尝试评估时出现问题:

test :: Free Equation ()
test = (hoistFree (inj :: Blank 'L Math a -> (Math :+: Blank 'L Math) a)
. blank
. (math :: MathExpr x -> Free Math ())
$ "hi"
)
`equals` (math $ "world")

这显然是循环的,将我的 CPU 占用为 100%。计算将其结果打印为:

Free (Equation (Free (DirectSum {unDirectSum = Right

此时该值被截断并且 GHCi 退出。因此,显然可以弄清楚 equals 的第一个参数位于直接和的后半部分,但它似乎无法计算空白。

我所有的函数都是完整的,我在这里看不到底部,但我从来不擅长定点组合器。有什么想法吗?

编辑:带有免费 monad 的模块现在位于:http://lpaste.net/93471 模块 Data.Domain 位于:http://lpaste.net/93472

最佳答案

(我没有足够的代表来发表评论,所以我做出了这个蹩脚的答案......)

你的 lpastes 中的代码对我来说(几乎)适用于 GHC 7.6.3 和 free-3.4.2

我确实必须更改一些内容才能进行类型检查,但它们非常简单。

  • 将 (MathExpr a) 替换为文本。

  • 添加 -XKindSignatures 和 -XOverloadedStrings。

  • 使用独立推导进行(显示空白)推导。

    派生实例(Show(g(Free g())),Show f) => Show(Blank k g f)

我只能想象最后一个影响终止的情况。

这些更改之后,我在 ghci 中看到了这一点:

*> test
Free (Equation (Free (DirectSum {unDirectSum = Right (Blank (Free (Math "hi" (Pure ()))) (Pure ()))})) (Free (DirectSum {unDirectSum = Left (Math "hello" (Pure ()))})) (Pure ()))

那么,也许您正在使用 GHC 和免费的过时/有缺陷的组合? HTH。

关于haskell - 使用自由 Monad 的发散,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19042768/

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