作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有没有办法用 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)
为了兼容性垫片,我想为所有版本定义 HasCallStack
GHC 回到 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/
我是一名优秀的程序员,十分优秀!