Fre*_*ind 6 haskell types scala algebraic-data-types
我和Scala一起学习Haskell.我试图在Haskell中定义以下Scala类型,但失败了:
sealed trait Expr
case class Value(n: Int) extends Expr
case class Add(e1: Expr, e2: Expr) extends Expr
case class Subtract(e1: Expr, e2: Expr) extends Expr
Run Code Online (Sandbox Code Playgroud)
有人能举个例子吗?
在scala中,联合类型使用密封的类/特征进行模拟,其中包含多个包含各个案例的子类.这些可以直接在Haskell中定义:
data Expr = Value Int | Add Expr Expr | Subtract Expr Expr
Run Code Online (Sandbox Code Playgroud)
这与scala不同Value
,Add
并且Subtract
是Expr
类型的构造函数,而在Scala
个别情况下类也有自己的类型,可以直接引用,例如
def printValue(v: Value): Unit = { println(v.n) }
Run Code Online (Sandbox Code Playgroud)
作为其他人发布的替代方案,这里的解决方案使用更接近scala的语法,依赖于小扩展GADTSyntax
.
{-# LANGUAGE GADTSyntax #-}
--- sealed trait Expr
data Expr where
-- case class Value(n: Int) extends Expr
Value :: Int -> Expr
-- case class Add(e1: Expr, e2: Expr) extends Expr
Add :: Expr -> Expr -> Expr
-- case class Subtract(e1: Expr, e2: Expr) extends Expr
Subtract :: Expr -> Expr -> Expr
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
553 次 |
最近记录: |