エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

Scalaに手を出す

性懲りもなく、また新しい言語に手を出しています。

オブラブ夏イベントでプログラミングErlangをいただきました。

プログラミングErlang

プログラミングErlang

そこでErlangに向かうかと思ったらこんな記事を読んでなぜかScalaに曲がり(笑)。

ネットでチュートリアル(著者、訳者に感謝)を見つけ、いろいろ試行中。


チュートリアルから、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