by shigemk2

当面は技術的なことしか書かない

第2期 第8回 H本読書会 in 秋葉原 #readhbon

おさらい

モジュール

Haskellにはモジュールというものがあり、プログラムを分割することが出来、いくつかのプログラムをエクスポートできる

モジュールのインポート

  • 標準モジュールをインポートしてみよう
  • ghciでもプログラムのファイルからでも可
  • import qualified Data.Map as M

標準モジュールの関数で問題を解く

  • Data.Listのwords関数など

干し草の中から針を探す

haystack.hs

シーザー暗号

caesar.hs

かっこいい数

firstTo40.hs

  • MaybeとJust

キーから値へのマッピング

findKey.hs

Mapを使いこなすなど

mapmaximum.hs

6.4 モジュールを作ってみよう

似たような目的の関数と型をまとめてモジュールに分けるのは良い習慣です。

Geometry.hs

Cube.hs

第7章 型や型クラスを 自分で作ろう

7.1 新しいデータ型を定義する

  • 型を自作してみる。
  • data キーワードを使うと、新しいデータ型を定義する構文になる。
  • enumみたいなやつ

7.2 形づくる

2種類の図形を扱う。

data Shape = Circle Float Float Float |
             Rectangle Float Float Float Float

値コンストラクタは何の変哲もない関数で、データ型にあったフィールドは、値コンストラクタ関数にとっての引数に対応する。

オーバーロードは出来ないけど部分適用は出来る。

shape.hs

適当な型をつくって遊んでみる。

man.hs

場合分けして定義する。

deriving Show

shape.hs

Point データ型で形を整える

nudge.hs

Shape をモジュールとしてエクスポートする

Shapes.hs

  • 値コンストラクタは、フィールドを引数に取ってデータ型(例えば Shape 型)の値を返す関数にすぎない

7.3 レコード構文

今度はデータ型を作る別の方法

person.hs

もっと良い書き方、それがレコード構文

person_record.hs

7.4 型引数

型引数をとっているので、Maybe は型コンストラクタ。型に引数があるから型引数。

単なる Maybe という型の値は存在できません。なぜなら、Maybe は型コンストラクタであって、型ではないからです。型コンストラクタは、すべての引数を埋めて初めて何かしらの値の型になれます。

Maybeを使って抽象度を上げようっていう話。

具体型とは、型引数を 1 つも取らない型か、あるいは、型引数を取るけれどもそれがすべて埋まっている型のことを指す。

型引数が便利なのは、さまざまな型を収納するデータ型を作れるところで、Maybeを定義するのに、中身の型ごとに別々の型にすることもできなくはないけど、型引数を使ってどんな型の値でも収納できる汎用の Maybe を作ったほうが便利。

Nothingは値を含まない。

factorial.hs

ラムダ計算 - Wikipedia

今日はP122まで 次回は自動車は型引数を取るべきか?から