如何将Scala案例类定义转换为Haskell?

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)

有人能举个例子吗?

Lee*_*Lee 7

在scala中,联合类型使用密封的类/特征进行模拟,其中包含多个包含各个案例的子类.这些可以直接在Haskell中定义:

data Expr = Value Int | Add Expr Expr | Subtract Expr Expr
Run Code Online (Sandbox Code Playgroud)

这与scala不同Value,Add并且SubtractExpr类型的构造函数,而在Scala个别情况下类也有自己的类型,可以直接引用,例如

def printValue(v: Value): Unit = { println(v.n) }
Run Code Online (Sandbox Code Playgroud)


chi*_*chi 6

作为其他人发布的替代方案,这里的解决方案使用更接近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)