12月26日/27日の学び

プログラミングHaskellのほうが断然わかりやすい。すごしずつHaskellの文法が見えてきた感じ。

用語整理

  • 型とはお互いに関連する値の集合
  • Haskellではすべての式は型を持つ
  • Bool型もChar型もInt型も全てお互いに関連する値の集合
  • リスト型もタプル型も全てお互いに関連する値の集合

関数型

  • 関数型も型の一種
  • 関数型はある型の引数を他の型の結果に変換する

多相型

  • 1つ以上の型変数を含む型1つ以上の型変数を含む型をもつ式は多相的と呼ばれる
  • lengthは[a]->Intなので多相的

クラス制約

  • 型変数がどの型クラスのインスタンスなのかを制約する
  • クラス制約を利用することでNumクラスのインスタンスである型変数aなどを指定できる

多重定義型

  • 1つ以上のクラス制約を持つ型は多重定義型と呼ばれる

参考サイト

型クラス - ウォークスルー Haskell takafumi-s.hatenablog.com

12月12日の学び

データ型の定義

  • 新しいデータ型Shapeの作成は以下の通り
  • 等号"="の後ろの部分を値コンストラクと呼ぶ
  • 値コンストラクタはフィールドを引数にとってデータ型を返す関数
Prelude> data Shape = Circle Float Float Float | Rectangle Float Float Float Float
Prelude> :t Circle
Circle :: Float -> Float -> Float -> Shape
Prelude> :t Rectangle
Rectangle :: Float -> Float -> Float -> Float -> Shape

12月11日の学び

  • そもそも型は、変数がメモリにアクセスする場合にint型ならXXXバイト、char型ならXXXバイトというようにアクセスするサイズを決めるために用いられると思っていたけど、それだけではないらしい。
  • 型を用いることである種のバグが存在しないことにも繋がるらしい。

laborify.net

12月9日&10日の学び

最近Haskellばかり書いているな。。

メモ

  • 述語とは真理値を返す関数

map関数

関数とリストを受け取り、その関数をリストの全要素に適用して新しいリストを生成する。

Prelude> map (+3) [1, 5, 3, 1, 6]
[4,8,6,4,9]
Prelude> map (map (^2)) [[1, 2], [3, 4, 5, 6], [7, 8]]
[[1,4],[9,16,25,36],[49,64]]

ラムダ式

ラムダ式は1回だけ必要な関数を作るときに使う無名関数。通常ラムダ式高階関数に渡す関数を作るためだけに使われる。

Prelude> map (+ 3) [1, 2, 3]
[4,5,6]
Prelude> map (\x -> x + 3)[1, 2, 3, 4]
[4,5,6,7]

畳み込み

  • リストの再帰処理には、「再帰せず初期値を設定する場合」と「再帰する場合」を分けて書く必要がある。
  • 畳み込みでは両者を区別する必要がない。
  • 畳み込みは正直良くわからないので練習がまだ必要。。。

畳み込みのフォーマット

foldl 2引数関数 初期値 リストの形式を取る

左畳み込みの例

  • 左畳み込みはリストの左端の要素から始める
  • 左畳み込みを用いたmapの実装例は以下
  • 注意:'++'は2つのリスト同士を結合してリストを生成する演算子
map' :: (a -> b) => [a] -> [b]
map' f xs = foldl (\ acc x -> acc ++ [f, x]) [] xs

右畳み込みの例

  • 右畳み込みはリストの右端の要素から始める
  • 右畳み込みを用いたmapの実装例は以下
  • 注意:':'は文字とリストを結合してリストを生成する演算子
map' :: (a -> b) => [a] -> [b]
map' f xs = foldr (\ x acc -> f x : acc) [] xs

関数適用演算子

  • 関数適用演算子の$は最も低い優先度を持っており右結合
  • この特徴を利用すると式の中の()の数を減らすことで可読性を向上させることができる
Prelude> sqrt $ 3 + 4 + 9 + 1
4.123105625617661
Prelude> sqrt (3 + 4 + 9 + 1)
4.123105625617661
Prelude> sum (filter (> 10) (map (*2) [2..10]))
80
Prelude> sum $ filter (> 10) $ map (*2) [2..10]
80

12月8日の学び

ソフトウェアを以下の3通りに分類して考えるのはとても的を得ていると思う。そして大多数のソフトウェアエンジニアが最後の「一般 アプリケーションに従事している」というのもまさにそのとおり。

  • 「基盤系・学術系」
  • 「組み込み系」
  • 「一般アプリケーション」

is-log.blogspot.com