なぜMonadが必要なのか、
あるいはPureScriptについて
@ruicc
2014-06-08
だれ
@ruicc
Haskeller
サーバサイドエンジニア
興味あること:設計、型理論、圏論
PureScript =
	 	 	 	 	 	 Lightweight Haskell
ということで
Monadの話をします(2min)
エンジニアから見たMonad
(大雑把)
コンストラクタパターン
ただし超汎用性高い
ただし超柔軟性高い
Monadは何を構築するのか?
複雑なデータ
関数
プログラム(任意の作用を含む)
リアルワールドにおける
問題テンプレ
型A, Bが与えられているとする
solve :: (A -> B) -> IO ()
特定の問題を解く任意の高階関数を想像して下さい
返り値 IO () は単純のため
具体例1. Parser
parse :: Parser a -> String -> Either Errors a
type Parser a = String -> [(a, String)]
--This is a naive defin...
具体例2. WAI
-- WAI = Web Application Interface
run :: Port -> Application -> IO ()
type Application = Request -> IO Response
リアルワールドにおける
ライブラリ提供問題
先ほどの関数solveを考える
solve :: (A -> B) -> IO ()
関数(A -> B)は実装に幅をもつ
関数(A -> B)はどこまでも複雑になり得る
ライブラリはユーザへ関数(A...
ライブラリ提供問題
どうする?
オブジェクト指向言語
例えばクラスをフレームワークとして提供
Haskell, PureScript, etc.
例えばMonadをフレームワークとして提供
具体例1. Parserの場合
Parser構築手段をMonadで提供
Parser Combinatorsと呼ばれる
具体例2. WAIの場合
Application構築手段をMonadで提供
Scotty
RouterとControllerをMonadで記述
Yesod
Controllerやクエリ言語をMonadで記述
Monadユースケース
Monadの使いどころ
特定の目的のための値が欲しい
パラメータによる汎用化が困難な問題
目的毎に値を構築する必要がある
構築した値は再利用したい
ユースケース1. Parser
文字列等をパーズするためのパーザがほしい
パラメータによる汎用化が困難な問題
パーズ対象毎にパーザを構築する必要がある
構築したパーザは再利用したい
ユースケース2. EventHandler
イベント処理ためのEventHandlerがほしい
パラメータによる汎用化が困難な問題
イベント毎にEventHandlerを構築する必要がある
構築したEventHandlerは再利用したい
ユースケース3. CSSアニメー
ション
CSSアニメーションためのCSSビルダがほしい
パラメータによる汎用化が困難な問題
アニメーション毎にCSSビルダを構築する必要がある
構築したCSSビルダは再利用したい
ユースケース4. JavaScript
ブラウザ用動作記述ためのJSビルダがほしい
パラメータによる汎用化が困難な問題
機能毎にJSビルダを構築する必要がある
構築したJSビルダは再利用したい
ユースケース5. DSL
とあるDSLためのDSL記述言語がほしい
パラメータによる汎用化が困難な問題
機能毎にDSL記述言語を構築する必要がある
構築したDSL記述言語は再利用したい
Monad三行まとめ
型で表現可能な任意の値を
構築するための
一手段に過ぎない
そろそろMonadが欲しくなっ
てきた頃と思います
あなたの言語にMonadを取り
入れるために
Required primitives
Variables, First class functions, Function application
Required Type system fea...
PureScriptの話(出来るところまで)
Haskeller向け説明(15sec)
何が無いのか
GADTs
Type Families
Template Haskell
Concurrent support
Tuple
何が追加されているのか
Eff
IOを細かく分けて個別に扱える
forall e a. Eff e a == forall a. IO a
Record
Tupleの代わりか
JS側のObjectの表現
Row Polymorphism
Rec...
注意点
正格評価
forallが省略出来ない
リテラルが多相化してない
psciの使い方がghciと違う
エラーメッセージ弱い
以下JSer向け説明
JSの問題点
型が弱い
動的型付き言語
要求
強い型がほしい
NullとかAnyとか滅ぼしたい
型安全性がほしい
Q. 強い静的型があればそれ
でいいのか?
ここでJSの問題領域確認
DOM操作
ネットワーク
グラフィックレンダリング
UI関連
音声再生
イベントハンドリング
A. JSやばい、柔軟性が必要。
PureScriptと柔軟性
First class functions
高階関数は基本的かつ非常に高い柔軟性を持つ武器
Algebraic Data Type(ADT)
HaxeのEnum、という言い方はどうかと思うけど大
体それ。Haxeは...
PureScriptと柔軟性 (con’t)
Monad
超強いコンストラクタパターン(前述)
型の表現力が高いほど威力が増す
PureScriptターゲット
任意の規模の開発
複数人によるチームワーク
複雑なロジックの記述
PureScript Pros.
Haskellの性質を持っている
テスト容易性
QuickCheck is ready!!
高メンテナンス性
コード再利用性
学習コスト低い(ただしHaskellerに限る)
吐き出すJSコードが小さい
JSエ...
PureScript Cons.
Haskellそのものではない
superset/subsetどちらでもない
Hackageライブラリが使えない
Concurrent supportがない(GHCJSはある)
PureScriptと
パフォーマンスチューニング
mutable変数について
STモナドを使用することで可能。
さらなる最適化
FFIを用いる。
PureScriptとFFI
FFI
Foreign Function Interface
他言語を呼び出す仕組み
今はPS、JS間で交互に呼び出す仕組みを指す
言語間の境界を明確に定める
ぼんやり決める訳ではない
FFIのコスト
PSからJSを呼び出す際、JSのコードにPS側の型を付
ける必要がある
FFIの型を適切に記述しないと
PS側の型チェックが通らない
ランタイムエラー発生
FFIのコストはペイ出来るか
コミュニティがFFIライブラリを用意してくれればコス
トゼロ
FFIのコストと対比すべきコストは?
開発コスト
テストコスト
メンテナンスコスト
FFIライブラリ戦略
FFIライブラリ戦略
JavaScriptライブラリをPureScriptで使いたいのだが
ライブラリの解こうとする問題構造から考える
JavaScriptライブラリの構造から考える
ライブラリの解こうとする
問題構造から考える
PureScript側で問題を解くために適切なAPIを作成
JS側の構造は無視
PS側で自然に使える
ライブラリのアップデート追随が困難
JavaScriptライブラリの構造
から考える
JavaScriptライブラリのAPIをそのままPureScriptへ置
き換える
ライブラリ追従が楽
PS側使用時に工夫が必要となる可能性
まあMonadでなんとかなる(多分)
FFIライブラリ戦術
JavaScriptから見たPureScript
PSの関数(Curried function)
JSではNested function
forall e a. Eff e a
引数無しのfunction
Methods
function
PS...
PureScriptから見たJavaScript
ライブラリ
JS Objectの型付け問題
FFIでJS側で処理する
Monadで適切に構築する
JSのthis問題
thisの値を運ぶ事で対処
foreign import data Self...
PureScriptから中身の見えない
JavaScriptの値の扱い
foreign import data Self :: * -- Represent `this`
JavaScript側で生成した値
JavaScript側で扱う値
Pu...
Tips
PS側でどうしてもうまく型が付かない場合は、FFI経
由でJS側に押しつけ、JS側でなんとかするという逃
げ方がある
JS側の記述は自己責任となるが、それでPS側の型
システムが脅かされる訳ではない
FFIはJSに型を付けるという意味...
Try PureScript!
http://tryps.functorial.com/
余談1.
Monadは構築パターン
Comonadは分解パターン、そのうち流行る
余談2.
AltCSSもPureScriptでいいのではないか。モナドで構
築。
Purescript with Monad
Purescript with Monad
Upcoming SlideShare
Loading in...5
×

Purescript with Monad

10,798
-1

Published on

天下一altJS武闘会(2014/06/08)
PureScript枠発表です。

Published in: Science

Purescript with Monad

  1. 1. なぜMonadが必要なのか、 あるいはPureScriptについて @ruicc 2014-06-08
  2. 2. だれ @ruicc Haskeller サーバサイドエンジニア 興味あること:設計、型理論、圏論
  3. 3. PureScript = Lightweight Haskell
  4. 4. ということで Monadの話をします(2min)
  5. 5. エンジニアから見たMonad (大雑把) コンストラクタパターン ただし超汎用性高い ただし超柔軟性高い
  6. 6. Monadは何を構築するのか? 複雑なデータ 関数 プログラム(任意の作用を含む)
  7. 7. リアルワールドにおける 問題テンプレ 型A, Bが与えられているとする solve :: (A -> B) -> IO () 特定の問題を解く任意の高階関数を想像して下さい 返り値 IO () は単純のため
  8. 8. 具体例1. Parser parse :: Parser a -> String -> Either Errors a type Parser a = String -> [(a, String)] --This is a naive definition of parsers.
  9. 9. 具体例2. WAI -- WAI = Web Application Interface run :: Port -> Application -> IO () type Application = Request -> IO Response
  10. 10. リアルワールドにおける ライブラリ提供問題 先ほどの関数solveを考える solve :: (A -> B) -> IO () 関数(A -> B)は実装に幅をもつ 関数(A -> B)はどこまでも複雑になり得る ライブラリはユーザへ関数(A -> B)を構築する手段を 提供したい
  11. 11. ライブラリ提供問題 どうする? オブジェクト指向言語 例えばクラスをフレームワークとして提供 Haskell, PureScript, etc. 例えばMonadをフレームワークとして提供
  12. 12. 具体例1. Parserの場合 Parser構築手段をMonadで提供 Parser Combinatorsと呼ばれる
  13. 13. 具体例2. WAIの場合 Application構築手段をMonadで提供 Scotty RouterとControllerをMonadで記述 Yesod Controllerやクエリ言語をMonadで記述
  14. 14. Monadユースケース
  15. 15. Monadの使いどころ 特定の目的のための値が欲しい パラメータによる汎用化が困難な問題 目的毎に値を構築する必要がある 構築した値は再利用したい
  16. 16. ユースケース1. Parser 文字列等をパーズするためのパーザがほしい パラメータによる汎用化が困難な問題 パーズ対象毎にパーザを構築する必要がある 構築したパーザは再利用したい
  17. 17. ユースケース2. EventHandler イベント処理ためのEventHandlerがほしい パラメータによる汎用化が困難な問題 イベント毎にEventHandlerを構築する必要がある 構築したEventHandlerは再利用したい
  18. 18. ユースケース3. CSSアニメー ション CSSアニメーションためのCSSビルダがほしい パラメータによる汎用化が困難な問題 アニメーション毎にCSSビルダを構築する必要がある 構築したCSSビルダは再利用したい
  19. 19. ユースケース4. JavaScript ブラウザ用動作記述ためのJSビルダがほしい パラメータによる汎用化が困難な問題 機能毎にJSビルダを構築する必要がある 構築したJSビルダは再利用したい
  20. 20. ユースケース5. DSL とあるDSLためのDSL記述言語がほしい パラメータによる汎用化が困難な問題 機能毎にDSL記述言語を構築する必要がある 構築したDSL記述言語は再利用したい
  21. 21. Monad三行まとめ 型で表現可能な任意の値を 構築するための 一手段に過ぎない
  22. 22. そろそろMonadが欲しくなっ てきた頃と思います
  23. 23. あなたの言語にMonadを取り 入れるために Required primitives Variables, First class functions, Function application Required Type system features Higher Kinded Polymorphism 無くても大丈夫らしい? @khibinoさん情報 Overload(ex. Type Classes) Do notation
  24. 24. PureScriptの話(出来るところまで)
  25. 25. Haskeller向け説明(15sec)
  26. 26. 何が無いのか GADTs Type Families Template Haskell Concurrent support Tuple
  27. 27. 何が追加されているのか Eff IOを細かく分けて個別に扱える forall e a. Eff e a == forall a. IO a Record Tupleの代わりか JS側のObjectの表現 Row Polymorphism RecordとEffで活躍
  28. 28. 注意点 正格評価 forallが省略出来ない リテラルが多相化してない psciの使い方がghciと違う エラーメッセージ弱い
  29. 29. 以下JSer向け説明
  30. 30. JSの問題点 型が弱い 動的型付き言語
  31. 31. 要求 強い型がほしい NullとかAnyとか滅ぼしたい 型安全性がほしい
  32. 32. Q. 強い静的型があればそれ でいいのか?
  33. 33. ここでJSの問題領域確認 DOM操作 ネットワーク グラフィックレンダリング UI関連 音声再生 イベントハンドリング
  34. 34. A. JSやばい、柔軟性が必要。
  35. 35. PureScriptと柔軟性 First class functions 高階関数は基本的かつ非常に高い柔軟性を持つ武器 Algebraic Data Type(ADT) HaxeのEnum、という言い方はどうかと思うけど大 体それ。HaxeはGADTになったけど。 直積型、直和型、再帰型
  36. 36. PureScriptと柔軟性 (con’t) Monad 超強いコンストラクタパターン(前述) 型の表現力が高いほど威力が増す
  37. 37. PureScriptターゲット 任意の規模の開発 複数人によるチームワーク 複雑なロジックの記述
  38. 38. PureScript Pros. Haskellの性質を持っている テスト容易性 QuickCheck is ready!! 高メンテナンス性 コード再利用性 学習コスト低い(ただしHaskellerに限る) 吐き出すJSコードが小さい JSエコシステムとの親和性
  39. 39. PureScript Cons. Haskellそのものではない superset/subsetどちらでもない Hackageライブラリが使えない Concurrent supportがない(GHCJSはある)
  40. 40. PureScriptと パフォーマンスチューニング
  41. 41. mutable変数について STモナドを使用することで可能。
  42. 42. さらなる最適化 FFIを用いる。
  43. 43. PureScriptとFFI
  44. 44. FFI Foreign Function Interface 他言語を呼び出す仕組み 今はPS、JS間で交互に呼び出す仕組みを指す 言語間の境界を明確に定める ぼんやり決める訳ではない
  45. 45. FFIのコスト PSからJSを呼び出す際、JSのコードにPS側の型を付 ける必要がある FFIの型を適切に記述しないと PS側の型チェックが通らない ランタイムエラー発生
  46. 46. FFIのコストはペイ出来るか コミュニティがFFIライブラリを用意してくれればコス トゼロ FFIのコストと対比すべきコストは? 開発コスト テストコスト メンテナンスコスト
  47. 47. FFIライブラリ戦略
  48. 48. FFIライブラリ戦略 JavaScriptライブラリをPureScriptで使いたいのだが ライブラリの解こうとする問題構造から考える JavaScriptライブラリの構造から考える
  49. 49. ライブラリの解こうとする 問題構造から考える PureScript側で問題を解くために適切なAPIを作成 JS側の構造は無視 PS側で自然に使える ライブラリのアップデート追随が困難
  50. 50. JavaScriptライブラリの構造 から考える JavaScriptライブラリのAPIをそのままPureScriptへ置 き換える ライブラリ追従が楽 PS側使用時に工夫が必要となる可能性 まあMonadでなんとかなる(多分)
  51. 51. FFIライブラリ戦術
  52. 52. JavaScriptから見たPureScript PSの関数(Curried function) JSではNested function forall e a. Eff e a 引数無しのfunction Methods function PSのRecord JSのObject
  53. 53. PureScriptから見たJavaScript ライブラリ JS Objectの型付け問題 FFIでJS側で処理する Monadで適切に構築する JSのthis問題 thisの値を運ぶ事で対処 foreign import data Self :: * method :: forall e a. (Self -> Eff e a) -> Eff e a
  54. 54. PureScriptから中身の見えない JavaScriptの値の扱い foreign import data Self :: * -- Represent `this` JavaScript側で生成した値 JavaScript側で扱う値 PureScript側で見える必要はない しかし運ぶ必要がある
  55. 55. Tips PS側でどうしてもうまく型が付かない場合は、FFI経 由でJS側に押しつけ、JS側でなんとかするという逃 げ方がある JS側の記述は自己責任となるが、それでPS側の型 システムが脅かされる訳ではない FFIはJSに型を付けるという意味合いもある
  56. 56. Try PureScript! http://tryps.functorial.com/
  57. 57. 余談1. Monadは構築パターン Comonadは分解パターン、そのうち流行る
  58. 58. 余談2. AltCSSもPureScriptでいいのではないか。モナドで構 築。
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×