gpt4 book ai didi

haskell - 最不严格 (*)

转载 作者:行者123 更新时间:2023-12-03 12:10:01 24 4
gpt4 key购买 nike

是否可以实现(*)在 Haskell 中具有最不严格的语义(首选标准化的 Haskell,但扩展是可以的。使用编译器内部是作弊)?例如,这样的定义应该导致以下情况为真:

0 * ⊥ = 0
⊥ * 0 = 0

并且只有:
⊥ * ⊥ = ⊥

我可以构建满足上述情况之一的模式匹配,但不能同时满足这两种情况,因为零检查会强制该值。

最佳答案

是的,但仅使用受约束的杂质。

laziestMult :: Num a => a -> a -> a
laziestMult a b = (a * b) `unamb` (b * a)

这里 unamb 是 Conal Elliott 的 amb 的“纯”变体.在操作上, amb并行运行两个计算,返回先到者。表示 unamb取两个值,其中一个值(在域理论意义上)严格大于另一个值,并返回较大的值。 编辑:这也是 unamb,而不是 lub,所以你需要让它们相等,除非一个是底部。 因此,您有一个必须满足的语义要求,即使它不能由类型系统强制执行。这基本上实现为:
unamb a b = unsafePerformIO $ amb a b

在异常/资源管理/线程安全的情况下,需要做很多工作才能使这一切正常工作。
laziestMult如果 * 是正确的是可交换的。如果 * 是“最不严格的”在一个论点中是不严格的。

更多信息,请参阅 Conal's博客

关于haskell - 最不严格 (*),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14906261/

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