gpt4 book ai didi

haskell - 在 Haskell 中标记多态树时如何减少语法困惑?

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

所以我想要一种表示包含一组节点类型的树的类型。我还想要代表在重叠集上定义的类似树的类型。这是 Typed AST 问题的另一个版本。假设我的节点类型池是:

data Lit = Lit Int
data Var = Var String
data Hole = Hole Int

解析树可以包含 Lit s 或 Var s 但没有 Hole s。称为模板的第二种树可以包含 Lit年代, Var s 或 Hole s。

为简单起见,这里有一种称为 Add 的递归节点。 .
data Parse = A Lit | B Var
data Template = C Lit | D Var | E Hole
data Tree a = Leaf a
| Add (Tree a) (Tree a)

所以现在我可以声明数据,并且仍然可以对其进行模式匹配,唯一的问题是语法困惑。
aParse = Add (A Lit 3) (B Var "x")
aTemplate = Add (C Lit 4) (E Hole 3)
fun (Add (A lit) (B var) = ...

我想要一些类似于以下的糖:
ParseLit = A . Lit
TempLit = C . Lit

显然,构造函数(不是类型)组合的别名在 Haskell 中是不合法的。但是写这个的最干净的方法是什么,尽可能避免样板?

最佳答案

PatternSynonyms 语言扩展可以在这里提供帮助。它允许您为模式指定别名:

{-# LANGUAGE PatternSynonyms #-}

pattern ParseLit x = A (Lit x)

someFunc :: Parse -> Int
someFunc p = case p of
ParseLit x -> x
_ -> 0

模式同义词有两种风格:双向(如示例中)和单向。双向的也可以用作构造函数:
*Main> :t ParseLit
ParseLit :: Int -> Parse

*Main> ParseLit 77

关于haskell - 在 Haskell 中标记多态树时如何减少语法困惑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32187546/

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