【发布时间】:2011-10-05 08:59:40
【问题描述】:
在阅读文章 "Data types a la carte" by Wouter Swierstra 时,我一直无法将以下 Haskell 代码翻译成 Scala:
data Expr f = In (f (Expr f ))
Expr是用于表示算术表达式的数据类型,具体表达式可以写成如下:
data Val e = Val Int
type IntExpr = Expr Val
data Add e = Add e e
type AddExpr = Expr Add
我的问题是在 Scala 中实现f(可能被认为是构造函数的签名)。
P.S. 定义两个签名的联积,您可以稍后组合数据类型,得到 Expr (Val :+: Add ) 类型的表达式:
data (f :+: g) e = Inl (f e) | Inr (g e)
addExample :: Expr (Val :+: Add )
addExample = In (Inr (Add (In (Inl (Val 118))) (In (Inl (Val 1219)))))
【问题讨论】:
-
nb -- adt 是关于“Android 开发工具”,而不是关于代数数据类型,无论如何,应用于数据类型的首字母缩写词 ADT 通常意味着 抽象,而不是代数。
-
有两个问题阻碍了以简单的方式实现这一点:1)通用量化。 2) 高阶统一。