no_picture

読書メモ 関数プログラミング入門 Haskellで学ぶ原理と技法 1.7 仕様

関数プログラミング入門 Haskell で学ぶ原理と技法 の読書メモです。引用もしていますし、感想なども混ぜています。 本節は仕様についてです。 仕様と実装の関係について、語られます。 仕様はやりたいこと、実装は実現方法。 そんな感じのことがかかれています。 関数の仕様を表明し、そのやりかたとして引数と戻り値の組を用意する。 単純な実装を行い、よりよい実装にしていく方法が良いとされてます。 すごくBDD感漂うRspec的な手法が勧められていますね。 この手法の難しい点は、 仕様が利用者の要求とずれてしまうかも。 仕様を満たすための検証が膨大になりすぎて証明が大変 ということです。非常に身に覚えがあります。 練習問題 あまりおもしろくない解答をかきました。うーん。面白いの考えたい。 ついでに1章のまとめ。 一度、読書メモを本気でやってみようと思っていたのではじめてみましたが、思うよりもずっとずっと大変でしたが、関数プログラミングに対する基礎知識がグッと固いものになったと感じてます。 通し読みせずにやっているので、読み終わるのはいつになるのでしょうか。 これからもがんばってできる限り続けていきたいです。 関連 メモ用のリポジトリ 1章 1.6の練習問題

no_picture

読書メモ 関数プログラミング入門 Haskellで学ぶ原理と技法 1.6 仕様

関数プログラミング入門 Haskell で学ぶ原理と技法 の読書メモです。引用もしていますし、感想なども混ぜています。 本節は型についてです。強い型付けがよくわからなくて悩みました。 内容は 型の基本と強い型付け 多相型 型クラス といった感じです 型の基本と強い型付け 値は型という集まりに分類することができて、様々な型があります。 Int, Float, Integer,リスト…などなど。 既存の型を組合せて新しい型も作れます。 (Int, Int), Int -> Int 型固有に演算があり、違う型に利用することは無意味です。意味がないので不当な式となります。 式であれば、必ず型があり、その型は式を構成する要素から推論できます。構成要素から型が決定できるので強い型付けになるようです。(ここがはっきりしなくて悩んだ) 弱い型つけの場合は暗黙のキャストなどにより実行してみないとわからない部分があるようです。 強い型付けの利点は つづりミスや混乱した定義をコンパイル時点で発見できる プログラムを書く際のルールになる だそうです。 引数や結果の型を考えることで型レベルの整合性を保ち、その中で値をやりくりするので、型の枠から外れることも防ぐことができて、明瞭なプログラム設計ができるようです。 多相型 式の型は 構成要素から決定できますが、関数合成や和や積などは複数の型に対して利用できているように見えます。これは型変数を利用することでこのような定義ができます。 「それって強い型付けなの?」という疑問に教われるのですが、型変数を含んでいても型なので問題がないようです。 曖昧であれば不正な式になるのだと思います。その場合は推論に任せず型指定をすることになります。 このように型変数を含む型を多相型と呼びます。 おまけで (->) は 型演算子 だそうで、右結合だそうです。Int -> Int は -> で演算して新しい型を作るとも言えます。 型式というものがありそうですが説明されてません。 型クラス 和や積をするつあめの (+), (*) がありますがこれを型変数で定義するには一般的すぎます。数値であるようなものであれば扱えて欲しい。 そのような似た型をまとめる型クラスという機能があります。型変数に制約をつけることができます。数値であるような型は Num クラスのインスタンスとなります。 Num a => a -> a -> a とかいたとき a がNumクラスのインスタンスであるという制約のもとで、 a -> a -> a

no_picture

読書メモ 関数プログラミング入門 Haskellで学ぶ原理と技法 1.5 定義

関数プログラミング入門 Haskell で学ぶ原理と技法 の読書メモです。 本節は定義についてですが、前節につづき関数ともいえそうです。 内容は * ガード付等式 * 再帰定義 * 局所定義 です。 ガード式の前に関数だけじゃなく、他の値も定義できるという話がでてきますが、それ以上でもそれ以下でもないです。一般的なプログラミング言語なら定数ともいえそうです。 つづいて、ガード付等式です。ガード 付等式 か ガード付 等式悩みましたがたぶん後者でしょう。 まだ、登場していませんが、パターンマッチよりも細かいところで分岐させるのによく使います。数学のノートみたいに見えてよいです。一応例をだしておきます。 compare x y | x > y = LEFT | x == y = EQUAL | x < y = RIGHT LEFT、EQUAL RIGHTの定義をしていませんが、比較して大きいほうを返す関数です。よみやすいです。このように3パターン以上に分岐する場合は if を使用するよりもよみやすくなります。 ifを使うと compare x y = if x > y then LEFT else if x == y then EQUAL else RIGHT みたいな感じでしょう。 再帰定義 あまり文章での説明がなかったです。関数の中で自分の名前が使用できます。実際に手を動かして簡約してみると、再帰というものが存在して良いことが確認できると思います。 ただし、終了条件がなければ収束することなくどんどん大きくなります。 局所定義

no_picture

読書メモ 関数プログラミング入門 Haskellで学ぶ原理と技法 1.4 関数

関数プログラミング入門 Haskell で学ぶ原理と技法 の読書メモです。 本節は 関数 について。 要点は 外延性 カリー化 演算子と関数 優先順位 結合順序 関数合成 です まず関数は値として扱えますが、表示することはできません。引数を適用することで表示できる場合があります。 また、関数は 引数の値 を戻り値 の型に変換する(対応をつける)役目をもちます。関数の型を示すには -> 演算子を使い 型A を受取り 型B を返す場合 A -> B とかきます。 関数 と 関数に値を適用したものを混同しないように気をつけたほうがよいそうです。 外延性 関数が等しい場合は任意のxに対し以下が成立します。 f x = g x この方法は関数に値を適用した結果が一致するので 適用的証明 というそうです。また ポイントワイズスタイル ともいうそうです。このように f や g はブラックボックスですが、引数と結果で確認できるので外延性の原理 逆に定義から f = g を示す場合はポイントフリースタイルというそうです。ただし、効率が違う場合があり、これは内包的性質というそうです。 カリー化 単一の引数の関数の複数の引数に分解できます。こうすると関数に引数をひとつだけ適用すると新しい関数を作成することができます。結果が変わらないので括弧が減ったり、引数を変えるだけで様々な効果をもつ関数がつくれる利点があります。Arrow を使う場合は逆に アンカリー化をする場合もあります。 演算子と関数 演算子も実質的には2引数の関数ですが中置することができます。Haskellでは 括弧で演算子を囲むことで通常の関数にもできますし、関数をバッククォートで囲むことで演算子のように利用できます。また、括弧で演算子を囲む場合は (+1) のようにして あらかじめ引数を適用したりもできます。これをセクションというそうです。 優先順位 結合順序 これらのおかげで 括弧を省略することができます。 これらの把握しておかないとHaskellのコードを読む際によくわからなくなるのでしっかりと慣れておいたほうが良いです。 関数は最優先で左結合です。 f x y + z であれば ((f x) y) + z と等価です。 右結合か左結合か は演算子によって違いますが、どちらでも同じ結果になるものもあります。これを結合性というそうです。+ や * は結合性があります。 関数合成 関数合成は関数と関数を演算できます。結合性です。 ある関数の結果を別の関数の引数にできる場合に利用できます。 f (g x) が正しい場合 (f .

no_picture

読書メモ 関数プログラミング入門 Haskellで学ぶ原理と技法 1.3 値

関数プログラミング入門 Haskell で学ぶ原理と技法 の読書メモです。 本節は 値 について。 値と式の関係。値と正格関数、非正格関数。がメインです。 値は 式を用いて表現できます。値を表現する式はひとつだけではなく、複数存在し、評価機が出力する表現は 標準表現 が利用されます。基本的には評価可能な式が表示されるということのようです。Rubyでいうと pメソッドの出力結果に近そうです。 また、値を表示しようとすると停止しない可能性が存在します。このような状態になる関数を正格関数と呼びます。具体的にシンプルに定義されてるのでわかりやすいです。正格でない関数は非正格なりますが、これは遅延評価でないと定義できないそうです。 練習問題は正格と非正格について考える問題でした。 関連 メモ用のリポジトリ 1章 1.3の練習問題

no_picture

読書メモ 関数プログラミング入門 Haskellで学ぶ原理と技法 1.2 評価

関数プログラミング入門 Haskell で学ぶ原理と技法 の読書メモです。 本節は評価を中心に式の簡約化についての説明です。 正規形という形を目指して式を簡略化していきますが、関数プログラミングにおいては、どのような手順で簡約しても最終結果が一致するのが特徴です。 代入のような破壊的な操作が存在する世界では、順序が影響します。 そこが命令型のプログラミングと違うところでしょう。そのため並列処理させるたべ順序に影響しないため、関数プログラミングが評価されてる部分だと思います。 話が脱線しましたが、簡約の手順には 1つだけでなく複数存在する可能性があります。そのためプログラミング言語によっては簡約の評価戦略が違うようです。 あと、簡約の手順が違う場合、停止しない場合が存在することもあります。 練習問題は評価の順序、停止性について考えるような問題でした。 関連 メモ用のリポジトリ 1章 1.2の練習問題

no_picture

読書メモ 関数プログラミング入門 Haskellで学ぶ原理と技法 1.1 セッションとスクリプト

関数プログラミング入門 Haskell で学ぶ原理と技法 の読書メモです。 本書は 2002年に出版されたIntroduction to Functional Programming using Haskell の2版の翻訳です。 いまになって日本語に訳されたということはそれなりの名著なのかなー。ということで、Haskellネタを書く機会があまりなかったので、読書メモを書いていこうと思います。 問題を解いてくのに最強の環境をつくろうぜ。と、意訳できる文章ではじまります。本節は Hugs を使用することを想定して セッション、スクリプトといった対話環境だからこそしっくりくる用語を中心に基本用語が解説されています。 スクリプトによって定義を追加していき環境を構築した上で 式を評価 するというのが主軸なのかなあ、と思います。環境/文脈は束縛の集りであるというのは非常にシンプルで実際の文脈の小ささは関数プログラミングの特徴と言えるのではないかな、と思いました。 あとは、定義には関数の定義がかかれ、関数には 型シグネチャ をかけることぐらいかな。 練習問題が関数定義の練習と束縛済みの関数を再利用するのが目的な感じでした。 関連 メモ用のリポジトリ 1章 1.1の練習問題