2012-03-02 15 views
2

SICPのようなパターンマッチングを使ってScalaで象徴的な微分関数を作りたいと思います。Scalaの象徴的な区別

differentiate(exp) = exp match 
{ 
    case + => 
    case * => 
} 

は「ネイティブ」の表現にScalaで、このことが可能です:私はこのような何かを書くことができるようにしたいと思いますか?

+1

あなたは 'def differentiate(exp:T)= ...'を意味しますか? expはどんなタイプですか?文字列?機能?どちらもちょうど「+」や「*」には適していません。 –

+0

これはあなたの質問のインスピレーションでしたが、まだ見ていないのであれば、Scalaのプログラミングのパターンマッチングの章(http://www.artima.com/pins1ed/case-classes- and-pattern-matching.html) –

+0

@userunknown式 – Frawr

答えて

1

前に見たすべての例では、式ツリーが関係しています。ケースクラスを使用してScalaで簡単に作成できます。たとえば、パターンマッチングとオブジェクト指向スタイルを含む概略スケッチ:

trait Exp { 
    def differentiate: Exp 
} 
case class Const(value: Double) extends Exp { 
    def differentiate = Const(0) 
} 
case class Var(label: String, power: Double) extends Exp { 
    def differentiate = this match { 
    case Var(l,0.0) => Const(0) 
    case Var(l,p) => Mul(Const(p), Var(l,p-1)) 
    } 
} 
case class Add(left: Exp, right: Exp) extends Exp { 
    def differentiate = Add(left.differentiate, right.differentiate) 
} 
case class Mult(left: Exp, right: Exp) extends Exp { 
    def differentiate = (left, right) match { 
    case (Const(c), exp) => Mul(Const(c), exp.differentiate) 
    case (exp, Const(c)) => Mul(Const(c), exp.differentiate) 
    case (e1, e2) => Add(Mul(e1.differentiate, e2), Mul(e1, e2.differentiate)) 
    } 
} 
2

試しましたか? :)

sealed trait Exp 
case object + extends Exp 
case object * extends Exp 

def differentiate(exp: Exp) = exp match { 
    case + => println("plus") 
    case * => println("times") 
} 

scala> differentiate(*) 
times 

しかし

scala> differentiate(+) 
<console>:1: error: illegal start of simple expression 
     differentiate(+) 
       ^

うーん、私はそれがすべてのシンボルでは動作しませんね。

+0

あなたは 'differentiate($ plus)'でそれを呼び出すことができます。 –

+0

'+'の問題はバグですか? – soc

+0

@soc私は特に '+'については分かりませんが、もちろん '{'、 ';'などの予約文字は動作しないと期待しています。 –

1

"ネイティブ"式では、いいえ。あんまり。あなたでき使用シンボル:

def foo(x: Symbol) = x match { 
    case '+ => "Plus" 
    case '* => "Times" 
} 

あなたが気付いた場合、シンボルはSICPもが物事を解析する方法です。 SICP 2.3.1

(deriv '(* x y) 'x) 
y 

を参照してください。これは、シンボルに一致させるためのきれいな構文を持っているかもしれませんが、最終的に、それはそれはやっていることすべてです。

関連する問題