2015-08-01 3 views
6

Ich lerne Haskell zusammen mit Scala. Ich habe versucht, den folgenden Scala Typen in Haskell zu definieren, aber nicht:Wie konvertiert man die Scala-Fallklassendefinition in Haskell?

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 

Könnte jemand mir ein Beispiel geben?

Antwort

7

In Skala werden Union-Typen mit einer versiegelten Klasse/Merkmal mit einer Reihe von Unterklassen mit den einzelnen Fällen emuliert. Diese können direkt in Haskell definiert werden:

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

dies von scala unterscheidet sich darin, dass Value, Add und Subtract sind Konstrukteure für den Expr Typ, während in Scala die Einzelfall-Klassen auch ihre eigene Art haben, die direkt verwiesen werden kann z.B

def printValue(v: Value): Unit = { println(v.n) } 
4

Als Alternative zu dem, was andere geschrieben, hier ist eine Lösung, die eine Syntax näher an scala verwendet, auf der kleinen Erweiterung unter Berufung 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