Pixel Pedals of Tomakomai

北海道苫小牧市出身の初老の日常

今日は第一回 ゆるふわHaskell入門会の日です

第一回 ゆるふわHaskell入門会に来ています。Hackathonがメインですが、トークもボチボチありますのでメモります。

究極の手続き型言語Haskell / @fumieval さん

  • 関数型言語とは
    • 関数を自在に操作、組み合わせて記述
  • 手続き型とは
    • 手続きを自在に組み合わせられる?
    • 違う。命令列をプログラムから扱うのは難しい
    • Haskellならできる
  • 呼び出しが階層になっている
    • 関数を呼び出していいても、APIを直接呼び出している
    • 移植性が低くなる
    • 冗長な書き方になっている
  • できることが多いことはデメリット
    • PHPやJSで文字列と数値の演算ができてまずい
    • Cのポインタも型を無視して扱える
    • 副作用が入っているとやっかいになる (Pythonでのデモ)
  • Haskellの場合
    • 関数呼び出しではなく、「変形」をする
    • レイヤ内で異なる抽象度のコードを混ぜられない
    • 階層内の依存がない (任意の層に変換できる)
    • 手続きをプログラム内で解釈して実行できる
  • それができるのは、「モナド
    • 同じ種類のコードを合成できる操作が保証されている
    • 6つに分類できる(ブログのエントリ参照)
    • 4回くらいモナドについて再発見
  • Haskellで作りたいものを作るライブラリ
    • ゲーム: free-game, gloss
      • free-gameで円を表示する作るデモ
      • free-gameでMonarisのデモ
    • 音楽: Haskore
    • 言語処理系: Trifecta, bound
    • Twitterクライアント: authenticate-oauth, http-conduit
    • スクレイピング: xml-lens, xml-conduit
    • パズルを解く: Ersatz
      • デモ・・・は実装が変わってなくて動かず(Haskellはライブラリの開発がすごく早いのでよくあること)
  • Haskellはいかに問題を解くかではなく、いかに武器を作るか
  • Q. モナドの6分類の状態と失敗での分類との対応は?
    • A. 「内包と継続」が失敗、「出力、環境、状態」が状態

Haskellと抽象化 / @amkkun さん

  • Haskellerは抽象化が大好き
  • 対象から注目すべき要素を重点的に、他は無視
  • 数値と文字を型による抽象化
    • 値の判定、比較、足し算引き算
    • Eqクラス、Ordクラス、足し算引き算はNumクラス
    • 型はまったく異なるが、性質、操作に共通点が多い
  • 型クラス
  • 他、Monoid, Category, Arrow, Functorなど
  • まとめ → haskellの抽象化は直感的、数学概念を使いやすい、型クラスは他の言語にない
  • Q. 数学が苦手なのですが
    • A. 数学を知らなくても書ける。Haskellをやると数学の力がつく
  • Q. 数学を使わないと解けない問題はなかったけど、具体例を知りたい
    • A. シンプルに書ける
    • A. 米田の補題でプログラムが高速化したり
    • A. 型とプログラムの推論を型で表していると思うと、数学の力で正当性がチェックされる
    • A. 先に型を書いて、型にあわせている。先に証明を書いているのと同じ
  • Q. 先に型を書いて証明をしている、とは?
    • A. ライブラリの型に合わせてコードを書く。先に型がある
    • A. 後付で型をつけることもできる
    • A. もし数学のことを知っていれば、それを表現できるってだけ。数学を元に設計された良いライブラリを使うことが大事では

Haskellチュートリアル / @its_out_of_tune さん

資料はこちら。チュートリアルなので、概要のみ書いておきます。

  • ghciの起動と四則演算、論理演算
  • 関数呼び出し、2項演算、セクション
  • 型変数、型クラス
  • インデント、何を大文字、小文字ではじめるのか
  • 束縛変数、ghciでのlet
  • 線形リスト。文字列は文字のリスト
  • take, drop, sum, product
  • 使いたくない関数
    • head, tail, !! :: 例外が発生してしまう(部分関数)
    • headの代わりにlistToMaybe、tailの代わりにdropが使える
  • [1..100], taku, drop, cycle, repeat, リスト内包表記
  • タプル、fst、snd, zip
  • タプルとリスト内包表記の組み合わせ
  • Q. 内包表記で書く順番は?
  • A. 先にxを書いて、その後条件を書く
  • ghciの:t、:t 1がNumであることについて
  • リストとタプル、式の結果の型の確認
  • 型クラス → Show, Num, Bounded
  • ghci の :i
    • 「Q. instance宣言を出さず、class宣言だけ見れないか」「A. 今のghciの機能にはない」
  • Num と型制約、5 :: Int、5 :: Integer
  • Show, Read, Num, Integral, Fractional, Eq, Ord, Bounded, Enum
  • ヤバい型クラス → Functor, Applicative, Monad, Monoid, Category, Arrow
  • Stringは[Char]の別名
  • and, or関数
  • 多引数関数の型。(&&), (||)
  • (+)と(==)の型
  • f :: (Num a, Num b) => a -> b -> aという関数について。型bの値は演算ができないので捨てるしかないだろう
    • g :: a -> b -> a ではさらに何もできない。g x y = xしかない
    • 型によって、不可能な実装が出てくる。不具合が起きにくい
    • C#Javaでも、ジェネリクスやインタフェースで同様の議論ができる
  • (1 +)の型。カリー化
  • :: で型定義を書く。今後は必ず型を書く
  • ifよりパターンマッチが簡単。データコンストラクタなら使える。数値ならNum制約が必要
  • リスト、タプルのパターンマッチ
    • fst, sndの代わりに
    • (x:xs)は[]にマッチしないので注意
  • Asパターン、ガード
  • whereとlet in。let inは局所的に使える
  • case文
  • 再起処理 → 実は重要でない
  • 階乗、階乗リスト、zip関数の再帰による実装
  • 再帰の基底部と再帰
  • クイックじゃないクイックソートの実装
  • 怖い人「数値を吐くときは、末尾再帰のほうがいい。リストは気にしなくていい」
  • 「評価戦略が違うので、普通の末尾最適化が効くのか」「言語仕様では要求してないが、大抵の処理系はやるでしょう」
  • 関数も第一級オブジェクト。数学的な意味の関数→高階関数
  • カリー化と部分適用の違い
  • 部分適用の例。高階関数の定義
  • app :: a -> (a -> b) -> b という型を実装してみる例
  • セクションの使い方 (: [1,2,3])、λ記法
  • 「ここからがHaskellです」
  • curryとuncurryの実装。(ただし、標準関数にある)
  • flip、zipWithを型から実装を考えてみる
  • map, foldl, foldr
  • ($)、(.)の使い方
  • ポイントフリースタイルとはなんぞや

参照透明な海を守る会 / @masterq_teokureさん

同人誌売るので、会社休んで買いに来てください! 著者も募集中。

LT

ゆるふわなHaskell話 / @ruiccさん
  • Haskellは簡単にIO実行ができない
    • 他の言語はIOがいつでも実行できて怖い
    • Haskellの副作用使用罪は怖い
    • スクリプト言語での視点と、安全性での視点の違い
  • IOはプログラムから制御できないもの
    • 現在時刻を得る関数は、制御不可能
    • テストが辛い、再利用が辛い、保守が辛い
    • Ruby なら Open classで
  • 開発環境の時間を変えては? → 言語の外の部分
    • 人間が何かをしなければならない。保守対処が増える
  • 外部でIOを実施し、引数で渡せば良い
    • 引数の引渡しの問題 → 他の諸問題よりマシでしょう
    • よって、IOは隔離すべき
  • IOを考えることは設計行為
  • 引数引き回しがダサいという風潮?
    • ダサいって話より、問題を解くべきじゃ
    • Readerモナドを使えば解決できるけど
  • IOと切り離せない問題もある
    • Graphics, Sound, GUI
  • IOを直書きすると、どこで発生するかわからなくなる
    • dirtyDeedsDoneDirtCheap : D4C
    • いともたやすく行われるえげつない行為
    • モナド変換子もliftIOがあるので一緒
    • Symantics → 特定のアクションを束ねたもの http://mizondev.net/d/20130420
  • Free Monadを使う → 制限されたIOとして使うと、安全(ゆるふわ)
  • IOを制限できる言語 → Haskell, Agda, Idris (つまりHaskell)
    • HaksellがIOを扱いにくいのではなく、他の言語がIOをまともに使えない
  • IOモナドは悪か → IOモナドでがりがり書いても、OCamlなどと同じ安全性
Haskellを仕事でゆるふわに使ってみた / @seizansさん
  • 元々プログラミングをするための勉強
    • すごいH本のIOの部分読めば動くものくらいは書ける
    • Javaのコード吐いたり、YesodでWebサイトを作ったり
  • お仕事
    • ライブラリがあればJavaでなくHaskellがいいのでは? → aws-sdk
    • API Test → 腐ってたJavaをHSpecで書き直し
  • Haskellの利用による副作用
    • チームの開発者の増加、バイトが増える、Haskellerが増える
  • Q. ここはHaskellが向いてるとかあります?
    • A. ライブラリがないからやりにくいというのはある。手続き的な処理は手続き的に書く
    • A. 強みは純粋な関数が出てくる部分

懇親会

ピザ屋にお金を払うために数分間待機のようです。