haskell

関数型 - パターンマッチ

 
パターンマッチのシナリオ:
  • 加減算を行うインタプリタ eval を実装する。
  • インタプリタは、手入力された抽象構文木(AST)を評価する。(5 + (7 - 9))
  • 手入力で AST を作成するメリットは、数式の字句解析と構文解析を省略できる点にある。
  • これにより、実装対象をインタプリタ(僅か10行ほど)に絞り込むことができる。
  • このインタプリタはパターンマッチの簡潔なサンプルとして優れている。
  • パターンマッチを使用すると、リストの分解など他にも面白いことができるが、今回のシナリオには含まれない。

関数型 - Yコンビネータ

 
Yコンビネータのシナリオ:
  • Yコンビネータ(こんな感じのやつ → Y(F) = F(Y(F)) )を無心に写経する。
  • サンプルとして fact(10) を計算する。
  • 変数名としても関数名としても、fact の名を冠するものは登場しない。

関数の実行時間を計測するには?

 
  • 処理系で用意されている方法があるなら、それを使用する。
  • 無ければ、関数の実行時間を計測する関数 time を作成する。
  • 計測対象のサンプル関数として、フィボナッチ数を計算する fib を作成する。
  • 計測単位は、可能な限り秒(sec)とする。
  • 計測精度はミリ秒でもマイクロ秒でも構わない。

関数型 - イテレータ

 
イテレータのシナリオ:
  • 高階関数 myEach は、配列要素を1つ取り出すごとに、これを引数としてコールバックを行う。
  • 呼び出し側は、3の倍数を見つけたらプリントする。
  • myEach は、可能であれば組み込み型の拡張として実装する。 このとき継承は使わない。

処理系のインストール

 

記事で使用している処理系のインストール方法、 及びシェルの起動と終了について記載します。

関数型 - 無限リスト

 
無限リストのシナリオ:
  • 無限に続く奇数列 (1, 3, 5, 7, 9 ...)、odd を作成する。
  • 最初の10件を配列(リスト)に取り込む。

関数型プログラミング - 目次

 

これは、関数型プログラミングの記事をブック形式にまとめた集約エントリです。 難易度の低いものから高いものへと順にページをめくって行くことが出来ます。

関数型 - 有限リスト

 
有限リストのシナリオ:
  • 有限の奇数列 (1, 3, 5 .. 19) 、odd を作成する。
  • 可能であれば、 無限リストへの道筋となるような実装を行う。
  • 値を一気に配列(リスト)に取り込む。

関数型 - 再帰呼び出し

 
階乗の計算を、再帰呼び出しを使用して書く。
  • サンプル: 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 3628800
  • いずれの処理系でも、非末尾再帰と末尾再帰の 2バージョンを作成する。 処理系によっては、末尾再帰で記述すると最適化される。
  • パターンマッチを使用できる処理系では、これを使用する。 そうでなければ if-else に準ずる構文を使用する。

関数型 - コールバック

 
コールバックのシナリオ:
  • 定形処理(x ** 2)を行う高階関数 foo を作成する。
  • 差分処理(x * 2)を行うラムダ関数を作成する。
  • 高階関数 foo は、ラムダ関数をコールバックしたあと、両者の和を求める。

関数型 - 写像 map

 
次の処理を、map関数を使用して書く。
  • 処理前: [1, 2, 3, 4, 5]
  • 処理後: [1, 4, 9, 16, 25] (各要素を2乗)

関数型 - ラムダ関数

 
次の計算を、ラムダ関数(匿名関数、無名関数)を使用して書く。
  • 2 * 3 = 6

関数型 - 畳み込み fold, reduce

 
次の2つの計算を、畳み込み関数を使用して書く。
  • 1 + 2 + 3 + 4 + 5 = 15
  • 1 * 2 * 3 * 4 * 5 = 120

プログラミング言語比較ページのまとめ

 

 配列の操作

Ruby Python Perl PHP JavaScript Java C# C++ D Haskell

 文字列の操作

Ruby Python Perl PHP JavaScript Java C# C++ D Haskell

 言語仕様全般

最初のお題 CRUD - Haskell 版

 

文字通り、初めて Haskell のコードを書いてみました。

まずは、 ふつうのHaskellプログラミング を半分ほど読んで雰囲気を掴みました。 そのあとは「最初のお題 CRUD」を書き上げるのに必要なことを Google で検索しまくりました。

Haskell のコードを書くにあたって、次のようなことを考えました。

  • Haskell(関数型)らしくなくても良いから、とにかく動くものを書き上げる。
  • ループ構造は再帰で実現する。
  • 保存したいデータは、関数に渡して持ち回る。
  • ハッシュ(連想配列)はタプル(tuple)のリストで代用する。
  • 正規表現はパーサコンビネータ(Parsec)で代用する。
  • 例外処理(error, catch)は使わない。 使うのであれば、良く理解してからにすべし。