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

12月7日の学び

カリー化の例としては、以下のような『2つ引数をとるmaxを以下のように定義しなおす』ことがわかりやすい。

# 引数を1つわたすと、その次の引数を1つ受け取る関数を返す
function _max(x){
    return function(y){
        return x > y ? x : y;
    }
}

12月6日の学び

型(データ型)と型クラス

  • 両者は別の概念
  • 型クラスのインスタンスが型(データ型)
  • Javaで例えるなら「型のSuperクラスが型クラス」というイメージ
  • 数の型クラスである'Numクラス'のインスタンスが'Int' 'Integer' 'Float' 'Double'
Prelude> :t 20
20 :: Num p => p
Prelude> 20 :: Int
20
Prelude> 20 :: Integer
20
Prelude> 20 :: Float
20.0
Prelude> 20 :: Double
20.0

12月4日の学び

ファイルの読み書きは直感的にできる

ファイルの書き込み

Prelude> writeFile "test.txt" "Hello, Haskell!"

ファイルの読み込み

Prelude> let str = readFile "test.txt"
Prelude> str
"Hello, Haskell!"
Prelude> :t str
str :: IO String