2015-08-01 17 views
6

Sto imparando Haskell insieme a Scala. Ho provato a fare definire il seguente tipo Scala di Haskell, ma non è riuscito:Come convertire la definizione della classe di case Scala 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 

qualcuno potrebbe darmi un esempio?

risposta

7

In scala, i tipi di unione vengono emulati con una classe/tratto sigillato con un numero di sottoclassi contenenti i singoli casi. Questi possono essere definiti in Haskell direttamente:

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

questo differisce da scala in quanto Value, Add e Subtract sono costruttori per il tipo Expr, mentre in Scala singole classi case hanno il loro proprio tipo che può essere direttamente riferimento per esempio

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

In alternativa a ciò che gli altri hanno registrato, ecco una soluzione che utilizza una sintassi più vicina a Scala, sulla base della piccola estensione 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 
Problemi correlati