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)
|
カテゴリ
主インデックス Haskell 記事リスト 圏論記事リスト 考えるということのリスト 考えるということ ラッセルのパラドックス Haskell Prelude 圏論 ボーカロイド jQuery デモ Python ツールボックス XAMPP Ruby ubuntu 脳の話 話のネタ リンク 幸福論 キリスト教 心の話 メモ 電子カルテ Dojo JavaScript C# NetWalker 以前の記事
最新のトラックバック
最新のコメント
ファン
記事ランキング
ブログジャンル
画像一覧
|
ファン申請 |
||
外部サイトRSS追加 |
||