性懲りもなく、また新しい言語に手を出しています。
オブラブ夏イベントでプログラミングErlangをいただきました。

- 作者: Joe Armstrong,榊原一矢
- 出版社/メーカー: オーム社
- 発売日: 2008/02/23
- メディア: 単行本(ソフトカバー)
- 購入: 8人 クリック: 284回
- この商品を含むブログ (97件) を見る
そこでErlangに向かうかと思ったらこんな記事を読んでなぜかScalaに曲がり(笑)。
ネットでチュートリアル(著者、訳者に感謝)を見つけ、いろいろ試行中。
abstract class Tree case class Sum(l: Tree, r: Tree) extends Tree case class Var(n: String) extends Tree case class Const(v: int) extends Tree object Sigma { type Environment = String => int def eval(t: Tree, env: Environment): int = t match { case Sum(l, r) => eval(l, env) + eval(r, env) case Var(n) => env(n) case Const(v) => v } def main(args: Array[String]) { val exp: Tree = Sum(Sum(Var("x"), Var("x")), Sum(Const(7), Var("y"))) val env: Environment = { case "x" => 5 case "y" => 7 } println("Expression: " + exp) println("Evaluation with x=5, y=7: " + eval(exp, env)) } }
実行結果。
Expression: Sum(Sum(Var(x),Var(x)),Sum(Const(7),Var(y))) Evaluation with x=5, y=7: 24
そうすると、他の言語で書いてみたくなるわけで。
Haskellで書き直してみる。
data Tree = Sum Tree Tree | Var String | Const Int deriving Show type Env = String -> Int eval :: Tree -> Env -> Int eval (Sum l r) env = (eval l env) + (eval r env) eval (Var s) env = env s eval (Const n) _ = n main = do let exp = Sum (Sum (Var "x") (Var "x")) (Sum (Const 7) (Var "y")) putStrLn $ "Expression: " ++ show exp putStrLn $ "Evaluation with x=5, y=7: " ++ show (eval exp env) where env :: String -> Int env "x" = 5 env "y" = 7