2015-08-01 4 views
6

Я изучаю Хаскелл вместе с Скалой. Я попытался сделать определить следующий тип Scala в Haskell, но не смог:Как преобразовать определение класса Case Scala в 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 

Может кто-нибудь дать мне пример?

ответ

7

В scala типы объединения эмулируются с закрытым классом/признаком с рядом подклассов, содержащих отдельные случаи. Они могут быть определены в Haskell непосредственно:

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

это отличается от Скале в том, что Value, Add и Subtract являются конструкторами для Expr типа, в то время как в Scala отдельные классы случае также имеют свой собственный тип, который можно ссылаться непосредственно например

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

В качестве альтернативы тому, что писал другие, вот решение, которое использует синтаксис ближе к Скале, опираясь на небольшом расширении 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 
Смежные вопросы