gpt4 book ai didi

haskell - 在 Haskell 中扩展数据类型

转载 作者:行者123 更新时间:2023-12-02 07:06:14 26 4
gpt4 key购买 nike

这里是 Haskell 新手。

我为一种最小的类似汇编的语言编写了一个评估器。

现在,我想扩展该语言以支持一些语法糖,然后我将编译回仅使用原始运算符。我的想法是我不想再次接触评估器模块。

我认为,在面向对象的做事方式中,人们可以扩展原始模块,以支持语法糖运算符,并在此处提供翻译规则。

除此之外,我只能考虑重写两个模块中的数据类型构造函数,以便它们不会发生名称冲突,并从那里继续,就好像它们是完全不同的东西一样,但这意味着一些冗余,因为我会必须重复(仅使用其他名称)共同的运算符。再说一次,我认为这里的关键字是 扩展

有没有一种实用的方法可以实现这一点?

感谢您花时间阅读此问题。

最佳答案

这个问题被 Phil Wadler 命名为“表达问题”,用他的话说:

The goal is to define a data type by cases, where one can add new cases to the data type and new functions over the data type, without recompiling existing code, and while retaining static type safety.

拥有可扩展数据类型的一种解决方案是使用类型类。

作为一个例子,我们假设我们有一种简单的算术语言:

data Expr = Add Expr Expr | Mult Expr Expr | Const Int

run (Const x) = x
run (Add exp1 exp2) = run exp1 + run exp2
run (Mult exp1 exp2) = run exp1 * run exp2

例如

ghci> run (Add (Mult (Const 1) (Const 3)) (Const 2))
5

如果我们想以可扩展的方式实现它,我们应该切换到类型类:

class Expr a where
run :: a -> Int


data Const = Const Int

instance Expr Const where
run (Const x) = x


data Add a b = Add a b

instance (Expr a,Expr b) => Expr (Add a b) where
run (Add expr1 expr2) = run expr1 + run expr2


data Mult a b = Mult a b

instance (Expr a, Expr b) => Expr (Mult a b) where
run (Mult expr1 expr2) = run expr1 * run expr2

现在让我们通过添加减法来扩展语言:

data Sub a b = Sub a b

instance (Expr a, Expr b) => Expr (Sub a b) where
run (Sub expr1 expr2) = run expr1 - run expr2

例如

ghci> run (Add (Sub (Const 1) (Const 4)) (Const 2))
-1

有关此方法以及一般表达式问题的更多信息,请查看 Ralf Laemmel 的视频 12在第 9 channel 。

但是,正如评论中所注意到的,这个解决方案改变了语义。例如,表达式列表不再合法:

[Add (Const 1) (Const 5), Const 6] -- does not typecheck

功能性珍珠 "Data types a la carte" 中提出了使用类型签名联积的更通用解决方案。 。另请参阅 Wadler 的 comment写在纸上。

关于haskell - 在 Haskell 中扩展数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6889715/

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