ゆるふわなHaskell話

3,408 views

Published on

Published in: Technology
0 Comments
10 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,408
On SlideShare
0
From Embeds
0
Number of Embeds
1,194
Actions
Shares
0
Downloads
15
Comments
0
Likes
10
Embeds 0
No embeds

No notes for slide

ゆるふわなHaskell話

  1. 1. ゆるふわなHaskell話@ruicc13年6月23日日曜日
  2. 2. 誰@ruiccHaskeller13年6月23日日曜日
  3. 3. ゆるふわな話IOの話13年6月23日日曜日
  4. 4. IOの話13年6月23日日曜日
  5. 5. よく聞きそうな話「HaskellはIO実行が簡単に出来ない、つらい」13年6月23日日曜日
  6. 6. Haskeller視点「大抵の言語はIOがいつでもどこでも実行出来てしまって危険極まりない、つらい」13年6月23日日曜日
  7. 7. それを聞いた非HaskellerHaskellは副作用使用罪がある!コワイ!僕:それは怖いねー(棒読み)13年6月23日日曜日
  8. 8. もう少し詳しく見る「HaskellはIO実行が簡単に出来ない、(ちょっとしたスクリプト感覚で書けなくて)つらい」13年6月23日日曜日
  9. 9. もう少し詳しく見る「大抵の言語はIOがいつでもどこでも実行出来てしまって危険極まりない、(チーム開発時やコードの保守やコードの再利用性が無くて)つらい」13年6月23日日曜日
  10. 10. 要は見ている問題が違う全ての言語への言及は「適材適所」を詳しく語ったもの13年6月23日日曜日
  11. 11. 以降ゆるふわな心でお楽しみください。13年6月23日日曜日
  12. 12. IOの何が問題なのか?IO実行を書く事はプログラムに「制御不可能なコード」を埋め込むこと13年6月23日日曜日
  13. 13. 例えば現在時刻の取得現在時刻取得はIO実行リアルワールドの参照time = getTime(); // IO発生!!13年6月23日日曜日
  14. 14. 例えば現在時刻の取得関数の中で現在時刻を取得してみるvar f = function doSomething() {var time = getTime(); // IO!!// do something...}➡ リアルワールドの現在時刻に依存した!!!➡ 制御不可能な値に依存する関数は筋が悪い13年6月23日日曜日
  15. 15. 制御不可能な関数IOが含まれる制御不可能な関数テストがつらい再利用時につらい保守がつらい13年6月23日日曜日
  16. 16. じゃあどうするシングルトンパターンを使うよ!えっ13年6月23日日曜日
  17. 17. シングルトンパターンシングルトンという名のグローバル変数グローバル変数に依存した関数テストがつらい再利用時につらい保守がつらい13年6月23日日曜日
  18. 18. じゃあどうするRubyならOpen classで出来るよ!えっと13年6月23日日曜日
  19. 19. それXXX言語ならできるよ言語依存の機能まあいいんですけどいいんですよ何も問題は無い...その言語なら。13年6月23日日曜日
  20. 20. もっと一般的に問題を解く開発サーバの実行時間変えるよ!はい13年6月23日日曜日
  21. 21. 言語の外を触る言語からは制御出来ない、言語の外の部分を変更する人間がナニカを保証する必要があるテストが終わったら元に戻す他に影響を出さない保守対象が増える13年6月23日日曜日
  22. 22. 言語内で問題を解く関数の外部でIO実行、引数で渡すvar f = function doSomething(time) {// do something...}➡ IOは発生しない➡ 安全!再利用しやすい!保守しやすい!13年6月23日日曜日
  23. 23. 引数渡しは何か問題が?引数を引き回す事はあまり問題ではないテスト可能性が低下するよりマシ保守性が低下するよりマシ再利用性が低下するよりマシ13年6月23日日曜日
  24. 24. IOは隔離する引数引き回しはともかく、IO実行部分は隔離することが望ましい言語によらない13年6月23日日曜日
  25. 25. IOと設計getTimeを例に考えてきた制御不能部分を考えることは、設計行為➡ IOを考える事は、設計行為13年6月23日日曜日
  26. 26. おまけ引数を一つ増やす?そうですねいろんな所が増えそうですね13年6月23日日曜日
  27. 27. 引数引き回しはダサいか引数引き回しがダサいという風潮...がある気がする意味がわからないよ!ダサさの前に問題を解こうぜ13年6月23日日曜日
  28. 28. 引数引き回し問題それが問題になるなら問題を解こう引数引き回し問題は、IOとは別問題Readerモナモナここでは触れません13年6月23日日曜日
  29. 29. まとめ:IOとはどんな言語でも、大抵のプログラムでは、設計上、隔離するべきものHaskellはIOを型で検知するに過ぎない13年6月23日日曜日
  30. 30. IOが隔離不可能な場合IOの隔離が出来ない場合はどうする?13年6月23日日曜日
  31. 31. 次の問題IOと切り離せないドメインはどうするGraphicsSoundsGUIREPL13年6月23日日曜日
  32. 32. 素直に書く全ての関数IO直書きするよ!ふむ13年6月23日日曜日
  33. 33. IO直書きIOがいつ何処で発生するか分からない他の言語と変わらない13年6月23日日曜日
  34. 34. つまりD4Cが発生するまちがいない13年6月23日日曜日
  35. 35. D4Cいともたやすく行われるえげつない行為dirtyDeedsDoneDirtCheap :: IO Presidentチーム開発中に能力が発現よくわからないところにありえないコードが埋没している保守を壊滅的にしてくれる13年6月23日日曜日
  36. 36. D4Cは防がねばならない13年6月23日日曜日
  37. 37. 自分でコンテキスト作成Monad TransformerでIOくるむよ!えーと13年6月23日日曜日
  38. 38. モナド変換子liftIOで結局IO使い放題いつIOが起こるか分からない!newtype MyIO a = MyIO { runMyIO :: IO a }deriving (Functor, Monad, MonadIO)main = runMyIO $ domyPutStrLn “Hello, MyWorld!”liftIO $ dirtyDeedsDoneDirtCheap -- D4C13年6月23日日曜日
  39. 39. モナド変換子ではD4Cは防げない13年6月23日日曜日
  40. 40. Symantics...特定のアクションを束ねるよ!Symanticsは詳しく知らないが..Symantcs = Syntax + Semantics13年6月23日日曜日
  41. 41. SymanticsとIO結局副作用にはIOモナドが要る注:元々SymanticsはIOをなんとかするものではないcomposedAction :: Monad m => Database m -> m ()composedAction db = doinsert db "foo"insert db "bar"dirtyDeedsDoneDirtCheap -- D4Chttp://mizondev.net/d/2013042013年6月23日日曜日
  42. 42. やはりD4Cは防げない13年6月23日日曜日
  43. 43. Free Monadを使うFree MonadDSLが簡単に生成出来るモナドプログラムを表現と解釈に分離13年6月23日日曜日
  44. 44. Free Monad as a Limited IO!Freeを制限されたIOとして使う安全!ゆるふわ!D4Cから守られたコンテクスト!モナド!お馴染みの書き方で書ける13年6月23日日曜日
  45. 45. まとめ: IOは制限するIOは制限し、必要な箇所で必要な分量だけ使う言語によらないはずだが..13年6月23日日曜日
  46. 46. IOを制限出来る言語HaskellAgdaIdris➡要するにHaskell13年6月23日日曜日
  47. 47. 初めの発言「HaskellはIO実行が簡単に出来ない、つらい」13年6月23日日曜日
  48. 48. なにHaskellはIOが厳しい?逆に考えるんだ「他にIOをまともに扱う 言語が存在しないんだ」と考えるんだ13年6月23日日曜日
  49. 49. いや本当にIOをコントロール出来ない言語ばかりなの何故ですかねHaskellerが抱く13年6月23日日曜日
  50. 50. IO Monadは悪なのか?13年6月23日日曜日
  51. 51. IO MonadIO Monadは悪という風潮...がある気がする気持ちはわからなくはない13年6月23日日曜日
  52. 52. 他言語とIO他言語では常にIOコンテキスト下HaskellをIOだけで書いてもScala,OCaml,F#と同程度の安全性13年6月23日日曜日
  53. 53. 私見必要であればIOモナドにガリガリ書いてもいいと思いますよ。13年6月23日日曜日
  54. 54. まとめ:IOとはどんな言語でも制御されるべきものしかしそれが可能な言語は何故か少ない13年6月23日日曜日
  55. 55. ゆるふわなHaskell話でした。13年6月23日日曜日

×