askForWords

Yet Another Haskell Tutorial を読んでいたら、45頁に、端末から入力した文字列を文字列のリストにして返す関数 askForWords のプログラム例が載っていた。

askForWords = do
  putStrLn "Please enter a word:"
  word <- getLine
  if word == ""
    then return []
    else do
      rest <- askForWords
      return (word : rest)

askForeWords 関数を実行すると、次の実行例のように、端末から入力した文字列をリストとして返してくれる。(入力を終了する時は空行を入力する。)

*Main> askForWords
Please enter a word:
hello
Please enter a word:
world
Please enter a word:
how
Please enter a word:
are
Please enter a word:
you
Please enter a word:

["hello","world","how","are","you"]

最後の行の return (word : rest) でどうして上のようなリストになるのか不思議だが、これは、askForWords が再帰関数だからだ。空行の入力で askForWords 関数から抜けたとき、戻り値は次のようになる。

"hello" : ( "world" : ( "how" : ( "are" : ( "you" : []))))

手続き型の言語のループに慣れていると上の結果が不思議に思えるが、要するに、Haskell のループはすべて一個の再帰関数なのだ。

上のプログラムのようなものも、最初は馴染みにくいが、何回も使っているうちに再帰関数を使ったループを記述する時の定石のようなものが分かってくる。慣れの問題だ。

慣れ親しんだ手続き型のプログラムは、世界を変数という状態としてモデル化する。Haskell のような関数型の言語では、世界を関数の集まりとしてモデル化しているので、両者のモデル化の手法は全く異なっている。関数型言語のプログラミングは手続き型言語のプログラミングとは別の発想が必要だということを銘記しておくと、とまどいも少ないだろう。

ヨーロッパなどでは、学生が最初に習うのが Haskell だというところも現れているらしい。そういう学生たちは今度は手続き型のプログラム言語を学ぶときに戸惑うかもしれない。

Haskell にとまどうのも、たんに、まだよく知られていないからだけの理由かもしれない。


今日のHaskell
Prelude> let a = 5 :: Int
Prelude> let b = 5 :: Double
Prelude> :t a
a :: Int
Prelude> :t b
b :: Double

数値は明示的に型指定できる。
[PR]
by tnomura9 | 2010-11-14 15:44 | Haskell | Comments(0)
<< 黄金比 リボ払いは恐ろしい >>