How to convert case Scala class definition to Haskell?

I am learning Haskell with Scala. I tried to determine the following Scala type in Haskell, but failed:

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 

Can someone give me an example?

+6
source share
3 answers

In scala, union types are emulated with a private class / attribute with a number of subclasses containing individual cases. They can be defined directly in Haskell:

 data Expr = Value Int | Add Expr Expr | Subtract Expr Expr 

this differs from scala in that Value , Add and Subtract are constructors for the Expr type, whereas in Scala individual case classes also have their own type, which can be referenced directly, for example,

 def printValue(v: Value): Unit = { println(vn) } 
+7
source

As an alternative to what others are posting, a solution is used here that uses the syntax closer to scala, relying on a small GADTSyntax extension.

 {-# 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 
+4
source
 data Expr = Value Int | Add Expr Expr | Subtract Expr Expr 

https://wiki.haskell.org/Algebraic_data_type

+3
source

All Articles