So-net無料ブログ作成
検索選択

OCaml vs. Scala [パターンマッチ] [Scala]

今回はパターンマッチの比較。

OCaml Scala
匿名関数でのマッチ function 1 -> "One" | 2 -> "Two" | _ -> "Many" { case 1 => "One" case 2 => "Two" case _ => "Many" }:Int=>String
match構文でのマッチ match x with 1 -> "One" | 2 -> "Two" | _ -> "Many" x match { case 1 => "One" case 2 => "Two" case _ => "Many" }
変数束縛でのマッチ let (x, y) = (1, 2) val (x, y) = (1, 2)
タプルのマッチ let rec a n m =
  match (n, m) with
  | (0, m) -> m + 1
  | (n, 0) -> a (n - 1) 1
  | (n, m) -> a (n - 1) (a n (m - 1))
def a(n:Int, m:Int):Int = (n, m) match {
  case (0, m) => m + 1
  case (n, 0) => a(n - 1, 1)
  case (n, m) => a(n - 1, a(n, m - 1))
}
リストのマッチ let rec prod = function
  [] -> 1
| x::xs -> x * prod xs
val prod:List[Int] => Int = {
  case Nil => 1
  case x::xs => x * prod(xs)
}
ヴァリアント/caseクラスのマッチ function Some(x) -> x | None -> failwith "none" {case Some(x) => x case None => throw new Exception}:Option[Any]=>Any
XMLのマッチ - x match { case <elem>{x}</elem> => x}
ガード条件 let rec max = function
  x::[] -> x
| m::n::xs when m > n -> max (m::xs)
| m::n::xs -> max (n::xs)
val max:List[Int] => Int = {
  case x::Nil => x
  case m::n::xs if (m > n) => max(m::xs)
  case m::n::xs => max(n::xs)
}
as/@ let f = function '\\'|'\"' as c -> "\\"^String.make 1 c | x -> String.make 1 x val f:Char=>String = {case c @ '\\'|'\"' => "\\"+c case x => ""+x}

ガード条件含めて OCaml にあるものは一通りある。加えて XML もマッチングできる。これはかっこいいな。

2007-02-05: タプルの書き方をモダンな Scala のスタイルにした。


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0