作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我想像这样定义一棵树:
{-# LANGUAGE DatatypeContexts #-}
class Node a where
getContent :: (Num a) => a
data (Node a) => Tree a = Leaf a
| Branch a (Tree a) (Tree a)
-XDatatypeContexts 现已弃用。没有它是否可以做类似的事情?
最佳答案
您确定数据类型上下文实际上做了您认为的事情吗?这是deprecated because it was basically useless并被广泛认为是一个错误功能,因为它所做的只是迫使您添加额外的约束,而不提供任何超出您在没有它的情况下所拥有的类型的保证。
实际上确实有用的替代品是 GADT syntax 。您的类型的等效项如下所示:
data Tree a where
Leaf :: (Node a) => a -> Tree a
Branch :: (Node a) => a -> Tree a -> Tree a -> Tree a
在这种情况下,在创建 Tree
值时需要 Node
约束,但是当对 Tree
值进行模式匹配时,您也会得到自动保证 Node
实例存在,使该实例可用,甚至不需要它在接收 Tree a
作为参数的函数类型中。
关于haskell - 已弃用的 -XDatatypeContext 的替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13888720/
我是一名优秀的程序员,十分优秀!