私のためのHaskell再入門

  • Haskell環境の準備
    • StackというHaskellコンパイル制御ツールを使って、特定のパッケージを使う環境を整えると、『その環境のための』ghciまで入る。特定のパッケージを使うわけではなく、ローカルでHaskellの何かを始めようとするときにもStackを使うと、ghciまで入る。(参考1,参考2)
git clone https://github.com/commercialhaskell/stack.git
cd stack
stack new hoge
stack setup
stack build
stack ghci
  • Haskellの特徴
    • 関数型言語。関数型としての特徴が強く、そのことを前面に押し出している。すべてが関数、とも言う。関数と引数にしたり返り値にしたりする。再帰関数も好き。関数をリストの要素にもする(リストというのも関数なので、これは、リストという関数と、それ以外の関数のドッキング、という意味で関数型言語の特徴となる)
    • 型がガッチリしているとともに、型の特徴をピースに分けて、そのピースのいくつかだけを持つ、とかそういう仕組みも提供することで、型のコントロールをしやすくしている。それを実現するために、型には多重定義がなされ、型を取る関数には、複数の型に対応ができるようにしてあり、そのような関数を多相的と言う。
    • 遅延評価。代数では個々の変数の値が決まらなくても、式変形できるが、関数を組み合わせたHaskellのプログラムも関数が構築した世界を代数式変形するようにして持っている。具体的な値が欲しくなったときだけ、計算する。その計算は最後に行う。
    • モナド。プログラムは関数で書かれるが、そのうちの一部はモナドと呼ばれるものである。Haskellではその役どころが強調されている。
      • プログラムは処理の集まりであって、何をどうして、次にどうする、というようにも説明できるが、その処理を関数と見て、その関数が値(値を表す変数)をやりとりする世界というものがある。この世界を「自己関手の圏〜関手が圏をなし、その関手は「圏→同じ圏」に定まった関手」であると言う(関数プログラミングでや「圏→同じ圏」がふつう)。この世界には、色々な自己関手があるけれど、その中に、「モノイド(っぽい)」ものもあって、それがモナドだ、ということらしい。こちらこちら
      • "All told, a monad in X is just a monoid in the category of endofunctors of X, with product × replaced by composition of endofunctors and unit set by the identity endofunctor."(category of endofunctors : 自己関手の圏)(こちらより)
  • Haskellを学ぶ上での「これだけは」の予備知識
    • 表記
      • f(x)は関数f()をxに適用しているわけだが、これをfxと書く
        • fxyf(x,y)のこと、f(gx)f(g(x))のこと
    • 命名規則シンタックス
      • 小文字始まり
      • 行頭下げで構造指定
      • type 型は大文字始まり
    • ghciのコマンド
      • :quit
      • :load hoge -- hoge.hsファイルを読み込む
      • :reload
      • :type hoge -- 型表示
      • :info hoge --クラス・型構成子・関数の情報表示
      • :kind type -- 型の推論
    • コード表示→こちらとか
  • モジュール
    • モジュールはいろいろ定義して使うためのもの
    • hogemodule.hsとして保存
    • 冒頭に
mocule Hoge where
    • 何かimport して使うモジュール
module Hoge where

import Hage
import qualified Hige
import Huge (hhuge)
      • Hageモジュールを使い、Higeモジュールも使う、ただしHigeモジュールはHige.xxxのようにモジュール名を関して関数を使う(名前空間での紛れをなくすために)、Hugeモジュールは全部は読み込まず、hhugeなる特定の関数のみを読み込む