作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为将 ADT 与显式子类型相结合的数据类型寻找合适的名称。
在我的一个应用程序中,我使用类似于 ADT 的结构来表示解析树,并在其上执行递归模式匹配。我发现如果我可以将 ADT 与子类型结合起来会很方便,如下例所示:
注意:示例是用 Haskell 的语法编写的,但这不是 Haskell 代码。
data Empty = Empty
data Expr = Int Int | Add Expr AddOp Expr
data OptionalExpr =
| Empty // I want to make Empty a subtype of OptionalExpr
| Expr // I want to make Expr a subtype of OptionalExpr
data OptionalExpr = EmptyExpr | NonEmptyExpr Expr
, 或者我们可以使用 Maybe
,但在我的应用程序中这是 Not Acceptable ,因为嵌入的级别可能非常深,解构像 (L1 (L2 (L3 (L4 (L5 value_wanted)))))
这样的深度嵌入值将是一场噩梦. PrimaryExpr = ID | LeftParen Expr RightParen
UnaryExpr = PrimaryExpr | NegateOp PrimaryExpr // -
MultExpr = UnaryExpr | MultExpr MultOp UnaryExpr // *
AddExpr = MultExpr | AddExpr AddOp MultExpr // +
CompExpr = AddExpr | AddExpr CompOp AddExpr
Expr = CompExpr
最佳答案
在评论中,你说:
I'm not sure how to encode a subtype hierarchy using GADTs. If you think it is doable, would you mind providing an answer with an example as to how the type hierarchy given in my example may be encoded?
{-# LANGUAGE GADTs #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeFamilies #-}
data Level = Primary | Unary | Mult | Add | Comp
type family Subtype a b where
Subtype Primary a = True
Subtype Unary Primary = False
Subtype Unary a = True
Subtype Mult Primary = False
Subtype Mult Unary = False
Subtype Mult a = True
Subtype Add Add = True
Subtype Add Comp = True
Subtype Add a = False
Subtype Comp Comp = True
Subtype Comp a = False
data Expr a where
ID :: Subtype Primary a ~ True => Expr a
Paren :: Subtype Primary a ~ True => Expr b -> Expr a
Negate :: Subtype Unary a ~ True => Expr Unary -> Expr a
Times :: Subtype Add a ~ True => Expr Mult -> Expr Mult -> Expr a
Plus :: Subtype Add a ~ True => Expr Add -> Expr Add -> Expr a
Compose :: Subtype Comp a ~ True => Expr Comp -> Expr Comp -> Expr a
Paren
的参数是多态的,您将需要对包含的术语进行类型注释,以表达您希望将该术语视为子类型层次结构的哪个“级别”。我希望您也需要使用您正在设计的任何语言来执行此操作。在 ghci 中,我们可以询问样本词的类型:
:t Compose (Times ID ID) (Negate (Paren (Plus ID ID :: Expr Add)))
Compose (Times ID ID) (Negate (Paren (Plus ID ID :: Expr Add)))
:: (Subtype 'Comp a ~ 'True) => Expr a
:t Negate (Plus ID ID)
<interactive>:1:9:
Couldn't match type ‘'False’ with ‘'True’
Expected type: 'True
Actual type: Subtype 'Add 'Unary
In the first argument of ‘Negate’, namely ‘(Plus ID ID)’
In the expression: Negate (Plus ID ID)
关于haskell - 是否有带有显式子类型的 ADT 名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36672346/
我是一名优秀的程序员,十分优秀!