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月3日の学び

式と文に明確な定義があるのかは不明だが、少なくとも「式は値を持つ」が「文は値を持たない」と思う。

式の型の確認

  • :t で型を確認できる
  • :: の記号は「〜の型を持つ」と読む
Prelude> :t 'a'
'a' :: Char

関数headは「任意の型のリストを引数に取り、その型の要素を一つ返す」と読む

Prelude> :t head
head :: [a] -> a

型クラス

  • 型クラスは何らかの振る舞いを定義するインタフェース
  • 型クラスは関数(メソッド)の集まり
  • 型はある型クラスのインスタンス
  • 型はある型クラスの記述する振る舞いを実装する

12月2日の学び(プログラミング言語の分類)

型推論

  • 周囲の文脈から型を推論すること
  • 変数に対する型の記載がなくなるため簡潔に記載ができる(ここ重要!)

静的型付け

  • プログラム実行前に全ての変数の型が決まっている
  • コンパイル言語に多い
  • CとかJavaとか

動的型付け

  • 動的型付けとはプログラム実行中にその変数が呼び出されるときまで変数の型が変わりうる
  • スクリプト言語に多い
  • Pythonとか

型安全

  • 型チェックを行うことにより(文法的には正しくても意味をもたない配列範囲外の処理参照など)動作未定義の処理が存在しないことを保証する
  • 代償として静的型付けでは型を指定するという煩雑さが存在する

例外処理

  • 定義:プログラムの上位の処理から呼び出されている下位の処理で継続不能、または継続すれば支障をきたす異常事態に陥ったとき、制御を呼び出し元の上位の処理に返し安全な状態になるよう回復処理 − 目的:上に記載の通り「異常事態発生の場合安全な状態に回復する」のが最大の目的(ようは回復したい!!)
  • 言語レベルで組み込みの例外処理を持たないC言語などでは、戻り値で(非負や非NULL)などでチェックする
  • 上の場合はデメリットが存在する①. そもそも戻り値は無視できる②. 具体的なエラー情報が不明③. 戻り値チェックの記述が煩雑
  • 例外処理は言語側にないといろいろ困るよね!というのが結論

例外安全

  • 実行中に失敗してもメモリ不足や不正な出力などを引き起こさないこと。例外安全には最低限から実行に失敗しないことの保証まで複数のレベルが存在。 okn-yu.hatenablog.com

例外中立

  • 発生した例外を握りつぶさないこと

dic.nicovideo.jp d.hatena.ne.jp

12月2日の学び①(関数型言語)

 関数型言語のメリット

  • 関数型言語だと「関数は当然値を返すだけ」なので、以下のような関数同士を組み合わせて別の関数の作成は容易である。
  • 同じことを手続き型言語でやろうとすれば、できなくはないけどここまで綺麗にはかけない。
doubleMe x = x + x
doubleUs  x y = doubleMe x + doubleMe y

12月1日の学び(Haskell)

Haskell関連の用語整理

Stack

  • Haskellのパッケージ管理やビルドを実行
  • パッケージ管理においては下のcabal-installの差し替えとして機能
  • ビルド実行においてはCabalをバックエンドで利用
  • 動作としてはJavaMavenに近い?

Cabal

  • ビルドシステム

cabal-install

  • パッケージ管理ツール

ghc