gpt4 book ai didi

haskell - 有没有办法在语法上模拟 GHC < 7.8.1 的空约束?

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

长话短说

有没有办法用 GHC <7.8.1 模拟空约束?某物类似于

{-# LANGUAGE NullaryTypeClasses #-}
class HasCallStack
instance HasCallStack

例如

foo :: HasCallStack => Int -> Int

在技术上与

相同
foo :: Int -> Int

动机

GHC 8.0.1 引入了 HasCallStack 作为:

HasCallStack = (?callStack :: CallStack)

为了兼容性垫片,我想为所有版本定义 HasCallStackGHC 回到 7.0.1

对于支持基于隐式参数的调用堆栈的 GHC 版本,HasCallStack 在功能上应该等同于我们在 GHC 8.0.1 中的功能。

对于不支持基于隐式参数的调用堆栈的 GHC 版本(即所有版本的 GHC <7.10.2),HasCallStack 应该在功能上相当于空约束。

为了完整起见,如果我们只关心 GHC,这里是我们可以使用的代码7.8.1 及更高版本:

#if MIN_VERSION_base(4,8,1)
type HasCallStack = (?callStack :: CallStack)
#else
class HasCallStack
instance HasCallStack
#endif

有没有办法让它适用于旧版本的 GHC?

作为引用,我将添加我当前的解决方案作为答案。但我很想得到就解决此问题的其他方法提供意见。

最佳答案

我不知道有什么方法可以支持与 GHC 中完全相同的语法8.0.1。但是,可以通过使用类型来选择性地添加约束同义词和 Rank2Types。以下代码适用于所有版本的 GHC回到 7.0.1

#if MIN_VERSION_base(4,8,1)
type HasCallStack a = (?callStack :: CallStack) => a
#else
type HasCallStack a = a
#endif

你的问题的例子

foo :: HasCallStack => Int -> Int

成为

foo :: HasCallStack(Int -> Int)

请注意,这是非常稳健的。我还没有遇到任何这行不通的情况,例如甚至在 foo 有其他约束或 foo 是一个 class 方法时也能工作。

关于haskell - 有没有办法在语法上模拟 GHC < 7.8.1 的空约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36369252/

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