bitterharvest’s diary

A Bitter Harvestは小説の題名。作者は豪州のPeter Yeldham。苦闘の末に勝ちえた偏見からの解放は命との引換になったという悲しい物語

Haskellドリル(初級編)

Haskell ドリル12 レコード構文

1.概略 タプルは、複数のデータを一つにまとめたものである。また、それぞれのデータの型が異なっていても構わない。一例をあげれば、、名前と年齢と身長の集まりは、次のような形で表すことができる。 (“Tanaka”, 42, 173.3) タプルの中で、データの数が…

Haskell ドリル11 局所変数

1.概略 長いプログラムを書いていると、一時的に変数を使いたいときがある。そのようなことを可能にしてくれるのが、letとwhereである。まず、letから説明する。letは次の四つの場面で使用することができる。 1.ローカルスコープで関数を作成する。 Prel…

Haskell ドリル10 場合分け

1.概略 「パターン照合」の記事で、ガードによる場合分けを説明した。しかし、関数の入り口ではなく、式の途中の中で場合分けをしたいときがある。例えば、無名関数の中でというときがそうである。このような時利用されるのが、if式またはcase式である。if…

Haskell ドリル18 filter関数(解答)

問題1:文字のリストからブランクを取り除く。 答 Prelude> filter (\x -> x /= ' ') "I am very happy." "Iamveryhappy." 問題2:文字のリストから文字’a’を取り除く。 答 Prelude> filter (\x -> x /= 'a') "I am very happy." "I m very hppy." 問題3…

Haskell ドリル17 map関数(解答)

問題1:自然数のリスト[1,2..]より各要素を5だけ増やしたリストを作成する。即ち、[6,7..]を作成する。 答 Prelude> take 10 $ map (+5) [1,2..] [6,7,8,9,10,11,12,13,14,15] 問題2:自然数のリスト[1,2..]より各要素を二乗したリストを作成する。 答 Pre…

Haskell ドリル15 foldl関数と遅延評価

1.概略 Haskellには便利な関数が沢山そろっているが、その中でも、優れたものの一つは、foldlである。これは、左畳み込みともいわれる。与えられた演算をリストの要素ごとに施し、それを初期値に畳み込むのがfoldlである。foldlは三つの引数を取る。第一引…

Haskell ドリル14 filter関数

1.概略 Lispを使っている頃、filterという関数もよく利用した。この関数は、与えられたリストから、条件を満たしたものだけをリストとして出力する。mapと同じように、第一引数は関数であり、第二引数はリストである。 2.例題 問題:自然数のリストから…

Haskell ドリル13 map関数

1.概略 Haskellの起源はLispである。Lipsは沢山あるプログラミング言語の中でも最も古い言語の一つで、1958年のジョン・マッカーシーの論文に始まる。Lispを使っていたころ、mapcarという関数がとても好きだった。この関数は、あるリストから別のリストへ…

Haskell ドリル16 パターン照合 (解答)

1.概略 前の記事で再帰関数を求める問題を出したが、ここではその回答を示す。回答は一つだけでなく複数あるので、ここで示す回答はその一例だと思ってほしい。なお、それぞれの関数には型シグネチャもつけた。問題1:リストから先頭の要素を散り除く関数…

Haskell ドリル9 型と型クラス

1.概略 Haskellは型にうるさい言語である。型が合っていないと計算してくれない。型が合っているかどうかの検査はコンパイル時に行われるので、厳しい型の言語に慣れていないプログラマにとって、コンパイルを無事通り抜けられるかは大仕事である。しかし…

Haskell ドリル8 パターン照合

1.概略 関数型プログラミングでは自分で自分を呼び出す関数は、これは再帰関数と呼ばれるが、好んで使われる。好んで使われる理由は、例題や問題を解くうちにだんだんに理解してもらえると思うが、主な理由は計算しようとする対象の姿がはっきりと見えるこ…

Haskell ドリル7 文字列

1.概略 Haskellでは文字列も文字から作られたリストである。例えば、"bird"という文字列は、'b','i','r','d'という文字から作られたリストで、'b':'i':'r':'d':[ ]あるいは['b','i','r','d']と表すことができる。文字列がリストであることから、文字列に対…

Haskell ドリル6 無名関数

1.概略 zipという関数は便利な関数で、二つのリストを要素ごとについにして返してくれる。例えば、奇数のリストと偶数のリストをzipする。即ち、zip [1,3..] [2,4..]すると、[(1,2), (3,4), (5,6),..]となる。zipWithはzipを拡張した関数で、要素ごとに演…

Haskell ドリル5 数のリスト

1.概略 リストはHaskellでは重要な概念である。これまでに数列を学んできたが数列もリストの一つである。1から5までの整数の数列を[1..5]で表したが、これは、1:2:3:4:5:[ ]とも表すことができし、[1,2,3,4,5]とも表すことができる。ここで[ ]は空リストを…

Haskell ドリル4 内包表記

1.概略 集合では10以下の整数全体の集合を { x | x Haskellにおいても、内包表記において同様の記述を許している。例えば、1から100までの整数の中から偶数の集合は、内包表記を用いると、 [ x | x 2.例題 問題:1から100までの整数の中から3でも5でも割…

Haskell ドリル3 数列

1.概略 数列はいろいろな場面ででてくる。自然数の数列、偶数の数列、3の倍数の数列などその時々の用途に応じて必要になる。Haskellでは数列は簡単に扱える。例えば、1から10までの数列であれば、[1..10]とすればよい。一般に、開始の整数をaとし、終了の…

Haskell ドリル2 関数

1.概略 前回の記事では、変数に数を与えて計算していたが、同じものを扱うときでも、いちいち、変数に数を与えて計算するのでは面倒くさい。そこで、ここでは、Haskellの一つの特徴である関数を利用し、関数の変数に値を与えれば、計算をしてくれるように…

Haskell ドリル1 四則演算

1.概略 小学校の頃、ドリルで算数や国語を学んだ人は多いと思う。新しい分野を学ぶとき、その考え方を身に付けるまで、同じような繰り返し作業を行う必要がある。ここでも、Haskellを学ぼうとする人のために、ドリル形式で、Haskellの基本を学んでもらう。…