SlideShare ist ein Scribd-Unternehmen logo
1 von 60
Downloaden Sie, um offline zu lesen
なぜ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 definition of parsers.
具体例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 -> B)を構築する手段を
提供したい
ライブラリ提供問題
どうする?
オブジェクト指向言語
例えばクラスをフレームワークとして提供
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 features
Higher Kinded Polymorphism
無くても大丈夫らしい? @khibinoさん情報
Overload(ex. Type Classes)
Do notation
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
RecordとEffで活躍
注意点
正格評価
forallが省略出来ない
リテラルが多相化してない
psciの使い方がghciと違う
エラーメッセージ弱い
以下JSer向け説明
JSの問題点
型が弱い
動的型付き言語
要求
強い型がほしい
NullとかAnyとか滅ぼしたい
型安全性がほしい
Q. 強い静的型があればそれ
でいいのか?
ここでJSの問題領域確認
DOM操作
ネットワーク
グラフィックレンダリング
UI関連
音声再生
イベントハンドリング
A. JSやばい、柔軟性が必要。
PureScriptと柔軟性
First class functions
高階関数は基本的かつ非常に高い柔軟性を持つ武器
Algebraic Data Type(ADT)
HaxeのEnum、という言い方はどうかと思うけど大
体それ。HaxeはGADTになったけど。
直積型、直和型、再帰型
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のRecord
JSのObject
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
PureScriptから中身の見えない
JavaScriptの値の扱い
foreign import data Self :: * -- Represent `this`
JavaScript側で生成した値
JavaScript側で扱う値
PureScript側で見える必要はない
しかし運ぶ必要がある
Tips
PS側でどうしてもうまく型が付かない場合は、FFI経
由でJS側に押しつけ、JS側でなんとかするという逃
げ方がある
JS側の記述は自己責任となるが、それでPS側の型
システムが脅かされる訳ではない
FFIはJSに型を付けるという意味合いもある
Try PureScript!
http://tryps.functorial.com/
余談1.
Monadは構築パターン
Comonadは分解パターン、そのうち流行る
余談2.
AltCSSもPureScriptでいいのではないか。モナドで構
築。

Weitere ähnliche Inhalte

Was ist angesagt?

Was ist angesagt? (20)

論文紹介 Star-Transformer (NAACL 2019)
論文紹介 Star-Transformer (NAACL 2019)論文紹介 Star-Transformer (NAACL 2019)
論文紹介 Star-Transformer (NAACL 2019)
 
実行トレース間のデータの差異に基づくデータフロー解析手法の提案
実行トレース間のデータの差異に基づくデータフロー解析手法の提案実行トレース間のデータの差異に基づくデータフロー解析手法の提案
実行トレース間のデータの差異に基づくデータフロー解析手法の提案
 
多相な関数の定義から学ぶ、型クラスデザインパターン
多相な関数の定義から学ぶ、型クラスデザインパターン多相な関数の定義から学ぶ、型クラスデザインパターン
多相な関数の定義から学ぶ、型クラスデザインパターン
 
ディープラーニングフレームワーク とChainerの実装
ディープラーニングフレームワーク とChainerの実装ディープラーニングフレームワーク とChainerの実装
ディープラーニングフレームワーク とChainerの実装
 
Clojure
ClojureClojure
Clojure
 
「深層学習」勉強会LT資料 "Chainer使ってみた"
「深層学習」勉強会LT資料 "Chainer使ってみた"「深層学習」勉強会LT資料 "Chainer使ってみた"
「深層学習」勉強会LT資料 "Chainer使ってみた"
 
Final LINQ Extensions II
Final LINQ Extensions IIFinal LINQ Extensions II
Final LINQ Extensions II
 
Chainerチュートリアル -v1.5向け- ViEW2015
Chainerチュートリアル -v1.5向け- ViEW2015Chainerチュートリアル -v1.5向け- ViEW2015
Chainerチュートリアル -v1.5向け- ViEW2015
 
はじぱた7章F5up
はじぱた7章F5upはじぱた7章F5up
はじぱた7章F5up
 
Chainer Meetup LT (Alpaca)
Chainer Meetup LT (Alpaca)Chainer Meetup LT (Alpaca)
Chainer Meetup LT (Alpaca)
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
 
Transformerを雰囲気で理解する
Transformerを雰囲気で理解するTransformerを雰囲気で理解する
Transformerを雰囲気で理解する
 
科学技術計算関連Pythonパッケージの概要
科学技術計算関連Pythonパッケージの概要科学技術計算関連Pythonパッケージの概要
科学技術計算関連Pythonパッケージの概要
 
[第2版]Python機械学習プログラミング 第9章
[第2版]Python機械学習プログラミング 第9章[第2版]Python機械学習プログラミング 第9章
[第2版]Python機械学習プログラミング 第9章
 
Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)
Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)
Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)
 
Chainer meetup20151014
Chainer meetup20151014Chainer meetup20151014
Chainer meetup20151014
 
Practical recommendations for gradient-based training of deep architectures
Practical recommendations for gradient-based training of deep architecturesPractical recommendations for gradient-based training of deep architectures
Practical recommendations for gradient-based training of deep architectures
 
論文紹介:「End-to-end Sequence Labeling via Bi-directional LSTM-CNNs-CRF」
論文紹介:「End-to-end Sequence Labeling via Bi-directional LSTM-CNNs-CRF」論文紹介:「End-to-end Sequence Labeling via Bi-directional LSTM-CNNs-CRF」
論文紹介:「End-to-end Sequence Labeling via Bi-directional LSTM-CNNs-CRF」
 
Rubyの御先祖CLUのお話(原本)
Rubyの御先祖CLUのお話(原本)Rubyの御先祖CLUのお話(原本)
Rubyの御先祖CLUのお話(原本)
 
Deep learning実装の基礎と実践
Deep learning実装の基礎と実践Deep learning実装の基礎と実践
Deep learning実装の基礎と実践
 

Andere mochten auch

ゆるふわなHaskell話
ゆるふわなHaskell話ゆるふわなHaskell話
ゆるふわなHaskell話
Kousuke Ruichi
 
GopherJS + Nashorn
GopherJS + NashornGopherJS + Nashorn
GopherJS + Nashorn
Takuya Ueda
 
並行プログラミングと継続モナド
並行プログラミングと継続モナド並行プログラミングと継続モナド
並行プログラミングと継続モナド
Kousuke Ruichi
 
Haskell Day2012 - 参照透過性とは何だったのか
Haskell Day2012 - 参照透過性とは何だったのかHaskell Day2012 - 参照透過性とは何だったのか
Haskell Day2012 - 参照透過性とは何だったのか
Kousuke Ruichi
 
すごいHaskell 第7章 型や型クラスを自分で作ろう(前編)
すごいHaskell 第7章 型や型クラスを自分で作ろう(前編)すごいHaskell 第7章 型や型クラスを自分で作ろう(前編)
すごいHaskell 第7章 型や型クラスを自分で作ろう(前編)
Nozomu Kaneko
 
altJS勉強会「Haxeすごいからみんな使え!」
altJS勉強会「Haxeすごいからみんな使え!」altJS勉強会「Haxeすごいからみんな使え!」
altJS勉強会「Haxeすごいからみんな使え!」
政樹 尾野
 

Andere mochten auch (20)

Elm overview
Elm overviewElm overview
Elm overview
 
IdrisでWebアプリを書く
IdrisでWebアプリを書くIdrisでWebアプリを書く
IdrisでWebアプリを書く
 
Scalaのオブジェクトの話
Scalaのオブジェクトの話Scalaのオブジェクトの話
Scalaのオブジェクトの話
 
ゆるふわなHaskell話
ゆるふわなHaskell話ゆるふわなHaskell話
ゆるふわなHaskell話
 
GopherJS + Nashorn
GopherJS + NashornGopherJS + Nashorn
GopherJS + Nashorn
 
並行プログラミングと継続モナド
並行プログラミングと継続モナド並行プログラミングと継続モナド
並行プログラミングと継続モナド
 
非ガチ勢「よし、Coffee script使おう!」
非ガチ勢「よし、Coffee script使おう!」非ガチ勢「よし、Coffee script使おう!」
非ガチ勢「よし、Coffee script使おう!」
 
php.js
php.jsphp.js
php.js
 
Programming haskell chapter10
Programming haskell chapter10Programming haskell chapter10
Programming haskell chapter10
 
An engineer uses monads
An engineer uses monadsAn engineer uses monads
An engineer uses monads
 
Elmで始めるFunctional Reactive Programming
Elmで始めるFunctional Reactive Programming Elmで始めるFunctional Reactive Programming
Elmで始めるFunctional Reactive Programming
 
altJSの選び方
altJSの選び方altJSの選び方
altJSの選び方
 
Haskell Day2012 - 参照透過性とは何だったのか
Haskell Day2012 - 参照透過性とは何だったのかHaskell Day2012 - 参照透過性とは何だったのか
Haskell Day2012 - 参照透過性とは何だったのか
 
Yesod勉強会
Yesod勉強会Yesod勉強会
Yesod勉強会
 
すごいHaskell 第7章 型や型クラスを自分で作ろう(前編)
すごいHaskell 第7章 型や型クラスを自分で作ろう(前編)すごいHaskell 第7章 型や型クラスを自分で作ろう(前編)
すごいHaskell 第7章 型や型クラスを自分で作ろう(前編)
 
Scalaで型クラス入門
Scalaで型クラス入門Scalaで型クラス入門
Scalaで型クラス入門
 
Yesodを支える技術
Yesodを支える技術Yesodを支える技術
Yesodを支える技術
 
Monad tutorial
Monad tutorialMonad tutorial
Monad tutorial
 
altJS勉強会「Haxeすごいからみんな使え!」
altJS勉強会「Haxeすごいからみんな使え!」altJS勉強会「Haxeすごいからみんな使え!」
altJS勉強会「Haxeすごいからみんな使え!」
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 

Ähnlich wie Purescript with Monad

組み込みスクリプト言語Mrubyを利用したwebサーバの機能拡張支援機構
組み込みスクリプト言語Mrubyを利用したwebサーバの機能拡張支援機構組み込みスクリプト言語Mrubyを利用したwebサーバの機能拡張支援機構
組み込みスクリプト言語Mrubyを利用したwebサーバの機能拡張支援機構
Ryosuke MATSUMOTO
 
エンジニア向け夏期特別講座 〜 Red Hat OpenStack徹底解説! 第二部 OpenStackの内部構造
エンジニア向け夏期特別講座 〜 Red Hat OpenStack徹底解説! 第二部 OpenStackの内部構造エンジニア向け夏期特別講座 〜 Red Hat OpenStack徹底解説! 第二部 OpenStackの内部構造
エンジニア向け夏期特別講座 〜 Red Hat OpenStack徹底解説! 第二部 OpenStackの内部構造
Etsuji Nakai
 
Scalatronで楽しく学ぶ関数型プログラミング
Scalatronで楽しく学ぶ関数型プログラミングScalatronで楽しく学ぶ関数型プログラミング
Scalatronで楽しく学ぶ関数型プログラミング
Jun Saito
 
Hpc server講習会第3回応用編
Hpc server講習会第3回応用編Hpc server講習会第3回応用編
Hpc server講習会第3回応用編
Osamu Masutani
 
20141224 titech lecture_ishizaki_public
20141224 titech lecture_ishizaki_public20141224 titech lecture_ishizaki_public
20141224 titech lecture_ishizaki_public
Kazuaki Ishizaki
 
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計
Tadayoshi Sato
 
オブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programmingオブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programming
Tomoharu ASAMI
 

Ähnlich wie Purescript with Monad (20)

組み込みスクリプト言語Mrubyを利用したwebサーバの機能拡張支援機構
組み込みスクリプト言語Mrubyを利用したwebサーバの機能拡張支援機構組み込みスクリプト言語Mrubyを利用したwebサーバの機能拡張支援機構
組み込みスクリプト言語Mrubyを利用したwebサーバの機能拡張支援機構
 
20171212 titech lecture_ishizaki_public
20171212 titech lecture_ishizaki_public20171212 titech lecture_ishizaki_public
20171212 titech lecture_ishizaki_public
 
Oedo Ruby Conference 04: Ruby会議でSQLの話をするのは間違っているだろうか
Oedo Ruby Conference 04: Ruby会議でSQLの話をするのは間違っているだろうかOedo Ruby Conference 04: Ruby会議でSQLの話をするのは間違っているだろうか
Oedo Ruby Conference 04: Ruby会議でSQLの話をするのは間違っているだろうか
 
第2回 配信講義 計算科学技術特論B(2022)
第2回 配信講義 計算科学技術特論B(2022)第2回 配信講義 計算科学技術特論B(2022)
第2回 配信講義 計算科学技術特論B(2022)
 
Mod mrubyについて
Mod mrubyについてMod mrubyについて
Mod mrubyについて
 
ATN No.2 Scala事始め
ATN No.2 Scala事始めATN No.2 Scala事始め
ATN No.2 Scala事始め
 
RubyによるMac OS Xデスクトップアプリケーション開発入門
RubyによるMac OS Xデスクトップアプリケーション開発入門RubyによるMac OS Xデスクトップアプリケーション開発入門
RubyによるMac OS Xデスクトップアプリケーション開発入門
 
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
 
20221226_TITECH_lecture_ishizaki_public.pdf
20221226_TITECH_lecture_ishizaki_public.pdf20221226_TITECH_lecture_ishizaki_public.pdf
20221226_TITECH_lecture_ishizaki_public.pdf
 
2014 11-20 Machine Learning with Apache Spark 勉強会資料
2014 11-20 Machine Learning with Apache Spark 勉強会資料2014 11-20 Machine Learning with Apache Spark 勉強会資料
2014 11-20 Machine Learning with Apache Spark 勉強会資料
 
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタつくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ
 
100mpusとopc brick ev3 ご紹介
100mpusとopc brick ev3 ご紹介100mpusとopc brick ev3 ご紹介
100mpusとopc brick ev3 ご紹介
 
エンジニア向け夏期特別講座 〜 Red Hat OpenStack徹底解説! 第二部 OpenStackの内部構造
エンジニア向け夏期特別講座 〜 Red Hat OpenStack徹底解説! 第二部 OpenStackの内部構造エンジニア向け夏期特別講座 〜 Red Hat OpenStack徹底解説! 第二部 OpenStackの内部構造
エンジニア向け夏期特別講座 〜 Red Hat OpenStack徹底解説! 第二部 OpenStackの内部構造
 
Scalatronで楽しく学ぶ関数型プログラミング
Scalatronで楽しく学ぶ関数型プログラミングScalatronで楽しく学ぶ関数型プログラミング
Scalatronで楽しく学ぶ関数型プログラミング
 
Hpc server講習会第3回応用編
Hpc server講習会第3回応用編Hpc server講習会第3回応用編
Hpc server講習会第3回応用編
 
20141224 titech lecture_ishizaki_public
20141224 titech lecture_ishizaki_public20141224 titech lecture_ishizaki_public
20141224 titech lecture_ishizaki_public
 
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計
 
オブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programmingオブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programming
 
Silkによる並列分散ワークフロープログラミング
Silkによる並列分散ワークフロープログラミングSilkによる並列分散ワークフロープログラミング
Silkによる並列分散ワークフロープログラミング
 
2014年の社内新人教育テキスト #1(プログラミング言語概論)
2014年の社内新人教育テキスト #1(プログラミング言語概論)2014年の社内新人教育テキスト #1(プログラミング言語概論)
2014年の社内新人教育テキスト #1(プログラミング言語概論)
 

Purescript with Monad