date: | 2012/10/19 |
---|
このページは私が個人的に思ったことを書いていくため、時々内容が変わります。 注意点としては、私は他の関数型言語どころか、他のどの言語についてもほとんど知りません。
プログラミング言語には、どんな種類があるでしょうか。調べてみました。 分類の基準については、 まつもとゆきひろの「プログラミング言語論」[前編](3):IT Pro を参考にしています。
ここに述べるものはあくまで”分けるとすれば”程度のもので、明確にわけられるわけではありません。あくまでおおざっぱなものです。
型付け:スタイル | 手続き型 | 関数型 | 論理型 | オブジェクト指向 |
---|---|---|---|---|
型がない | Lazy K,Unlambda | |||
動的型付け | BASIC(?) | LISP,Scheme, Erlang | Prolog, PARLOG | Perl,Ruby,PHP, Python,JavaScript |
静的型付け | C,ALGOL, Pascal | Haskell,F#, Ocaml, Scala | COBOL,FORTRAN, Java,C#,D |
調査不足で空欄がたくさんありますが、許してください。
さて、 Haskell の特徴について考えていきましょう。 良く言われることとして以下のことがあります。
以下では、それぞれがどういう意味なのか、具体例をまじえて見ていくことにします。
遅延評価 とは、式の評価をできる限り必要になるまで放置する、というものです。
これは非常に強力です。特に、無限リストを簡単に書くことができます。
ones = 1:ones
[2,4..]
zipWith (+) [2,4..] [1,3..]
これは、2つのリストの要素を、それぞれ足して無限リストを返しています。
これらのリストを実際に使う場合にはどうなるのでしょうか。
take 3 ones -- ones の3番目までの要素を返す
これを実行すると、次のようになる(ハズ。ホントのことはまだわかってない)。
take 3 ones
= take 3 (1:ones)
= take 3 (1:(1:ones))
= take 3 (1:(1:(1:ones))) <- 3番目までの要素がわかった
= 1 <- 値を返す
普通、プログラミングでは”有限のデータと有限の操作”しか扱えません。 しかし、遅延評価という仕組みによって、擬似的に無限のデータを作っているわけです。
すごい Haskell!!
同じ引数を与えれば、必ず同じ値を返すもの
関数を『プログラム中のどの場所、どのタイミングで実行しても同じ結果』が返るということから、 参照透明性 と言われます。
ここで、関数の例を上げてみましょう。
succ 1
1+1 つまり結果は 2
language = "Haskell!!"
doubleNumber x = if x > 100 then x else 2*x
次に、Haskell にとっては関数でないけど、Ruby などでは”関数”と呼ばれているものについて、 特に問題だと思われる例を説明しましょう。
total:=0
not_Function(x)={
count := 0
repeat
count := count + 1
total := total + count
until
count = x
return total
}
さて、この not_Function は非常に重大な問題のある”関数”です。 それは not_Function を呼び出すタイミングで結果が変わってしまうことです。 例えば、
not_Function(2) <- 結果は total=3
... <- なんか複雑な処理
not_Function(2) <- 結果は total=6 : どうして結果が変わるか考えてみてください
not_Function(x)={
total := 0
count := 0
repeat
count := count + 1
total := total + count
until
count = x
return total
}