Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

すごい Frege たのしく学ぼう!

6,054 views

Published on

歌舞伎座.tech #9 で使用したスライドです。JVM 版 Haskell であるプログラミング言語 Frege について、モナドを利用した Java ライブラリの呼び出し方に焦点を当てて紹介しています。なお、このプレゼンで触れ「なかった」話題についてはブログ記事 http://ccvanishing.hateblo.jp/entry/2016/03/22/020302 を参照のこと。

Published in: Technology
  • Dating for everyone is here: ❤❤❤ http://bit.ly/36cXjBY ❤❤❤
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Sex in your area is here: ❤❤❤ http://bit.ly/36cXjBY ❤❤❤
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Download or read that Ebooks here ... ......................................................................................................................... DOWNLOAD FULL PDF EBOOK here { http://bit.ly/2m77EgH } ......................................................................................................................... Download EPUB Ebook here { http://bit.ly/2m77EgH } ......................................................................................................................... Download Doc Ebook here { http://bit.ly/2m77EgH } ......................................................................................................................... .........................................................................................................................
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • ..............ACCESS that WEBSITE Over for All Ebooks ................ ......................................................................................................................... DOWNLOAD FULL PDF EBOOK here { https://urlzs.com/UABbn } ......................................................................................................................... Download Full EPUB Ebook here { https://urlzs.com/UABbn } .........................................................................................................................
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • If you want to download or read this book, Copy link or url below in the New tab ......................................................................................................................... DOWNLOAD FULL PDF EBOOK here { http://bit.ly/2m77EgH } ......................................................................................................................... Download EPUB Ebook here { http://bit.ly/2m77EgH } ......................................................................................................................... Download Doc Ebook here { http://bit.ly/2m77EgH } ......................................................................................................................... .........................................................................................................................
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

すごい Frege たのしく学ぼう!

  1. 1. すごい Frege たのしく学ぼう! Learn You a Frege for Great Good! チェシャ猫 (@y_taka_23) 歌舞伎座.tech #9 (2016/03/20)
  2. 2. 自己紹介 ● 名前 : チェシャ猫 ○ Twitter: @y_taka_23 ○ GitHub: y-taka-23 ● 好きなもの ○ Haskell ○ 形式手法 (Coq, Alloy, SPIN etc...) ● 自称 Frege エバンジェリスト
  3. 3. “Frege is a Haskell for JVM”
  4. 4. 本日の内容 ● Frege とはどんな言語なのか? ○ 基本的な特徴 ○ Haskell との比較 ● JVM 言語としての Frege ○ 非純粋性の取り扱い ○ Java ライブラリの呼び出し
  5. 5. 1. Frege とはどんな言語なのか?
  6. 6. Frege のエッセンス ● 純粋・非正格評価な関数型言語 ● 強い静的型付けと Hindley-Milner 型推論 ● エレガントな Java の呼び出しが可能
  7. 7. Haskell による Hello, World module Hello where greeting :: String -> String greeting name = “Hello, ” ++ name main :: IO () main = do putStrLn $ greeting “World”
  8. 8. Frege による Hello, World module Hello where greeting :: String -> String greeting name = “Hello, ” ++ name main :: [String] -> IO () main args = do putStrLn $ greeting “World”
  9. 9. ほとんど一緒!
  10. 10. 『すごい Haskell』翻訳実験 ● 全サンプルコードを Frege に ○ https://github.com/y-taka-23/learn-you-a-frege ● だいたい丸写しでコンパイルが通る
  11. 11. Haskell との互換性 ● 文法、標準ライブラリはほぼ完全に互換 ● ただし実用上の機能が使えない ○ 外部ライブラリ ○ 大部分の GHC 拡張 ○ Template Haskell ● Java ライブラリの呼び出しが鍵
  12. 12. 2. JVM 言語としての Frege
  13. 13. JVM 言語としてのアドバンテージ ● プラットフォーム非依存 ○ コンパイルすると Java ソースコードに ● 既存の Java ライブラリが呼び放題 ○ しかし副作用に関するスタンスが異なる ■ Frege : 純粋 ■ Java : 非純粋、オブジェクトが状態を持つ
  14. 14. Frege の純粋性を保ちつつ うまいこと Java を呼びたい
  15. 15. Java の非純粋性の 3 つのレベル ● イミュータブル ○ ??? ● ミュータブルだが入出力なし ○ ??? ● 入出力あり ○ ???
  16. 16. Java の非純粋性の 3 つのレベル ● イミュータブル ○ そのまま Frege のデータ型になる ● ミュータブルだが入出力なし ○ ??? ● 入出力あり ○ ???
  17. 17. イミュータブルなクラス data JBigInt = pure native java.math.BigInteger where pure native new :: String -> JBigInt pure native add :: JBigInt -> JBigInt -> JBigInt add3 :: JBigInt -> JBigInt -> JBigInt -> JBigInt add3 n1 n2 n3 = (n1.add n2).add n3
  18. 18. イミュータブルなクラス data JBigInt = pure native java.math.BigInteger where pure native new :: String -> JBigInt pure native add :: JBigInt -> JBigInt -> JBigInt add3 :: JBigInt -> JBigInt -> JBigInt -> JBigInt add3 n1 n2 n3 = (n1.add n2).add n3 Frege で使う際の型名
  19. 19. イミュータブルなクラス data JBigInt = pure native java.math.BigInteger where pure native new :: String -> JBigInt pure native add :: JBigInt -> JBigInt -> JBigInt add3 :: JBigInt -> JBigInt -> JBigInt -> JBigInt add3 n1 n2 n3 = (n1.add n2).add n3 イミュータブルなら pure native
  20. 20. イミュータブルなクラス data JBigInt = pure native java.math.BigInteger where pure native new :: String -> JBigInt pure native add :: JBigInt -> JBigInt -> JBigInt add3 :: JBigInt -> JBigInt -> JBigInt -> JBigInt add3 n1 n2 n3 = (n1.add n2).add n3 Java での完全修飾クラス名
  21. 21. イミュータブルなクラス data JBigInt = pure native java.math.BigInteger where pure native new :: String -> JBigInt pure native add :: JBigInt -> JBigInt -> JBigInt add3 :: JBigInt -> JBigInt -> JBigInt -> JBigInt add3 n1 n2 n3 = (n1.add n2).add n3 コンストラクタは new
  22. 22. イミュータブルなクラス data JBigInt = pure native java.math.BigInteger where pure native new :: String -> JBigInt pure native add :: JBigInt -> JBigInt -> JBigInt add3 :: JBigInt -> JBigInt -> JBigInt -> JBigInt add3 n1 n2 n3 = (n1.add n2).add n3 Java の BigInteger#add
  23. 23. イミュータブルなクラス data JBigInt = pure native java.math.BigInteger where pure native new :: String -> JBigInt pure native add :: JBigInt -> JBigInt -> JBigInt add3 :: JBigInt -> JBigInt -> JBigInt -> JBigInt add3 n1 n2 n3 = (n1.add n2).add n3 ドットでメソッド呼び出し
  24. 24. Java の非純粋性の 3 つのレベル ● イミュータブル ○ そのまま Frege のデータ型になる ● ミュータブルだが入出力なし ○ ??? ● 入出力あり ○ IO モナドになる
  25. 25. 入出力を伴うクラス data JFReader = mutable native java.io.FileReader where native new :: String -> IO JFReader native read :: JFReader -> IO Int readOneFrom :: String -> IO Int readOneFrom filename = do fr <- JFReader.new filename fr.read
  26. 26. 入出力を伴うクラス data JFReader = mutable native java.io.FileReader where native new :: String -> IO JFReader native read :: JFReader -> IO Int readOneFrom :: String -> IO Int readOneFrom filename = do fr <- JFReader.new filename fr.read 入出力用なら mutable native
  27. 27. 入出力を伴うクラス data JFReader = mutable native java.io.FileReader where native new :: String -> IO JFReader native read :: JFReader -> IO Int readOneFrom :: String -> IO Int readOneFrom filename = do fr <- JFReader.new filename fr.read 戻り値は IO モナド
  28. 28. 入出力を伴うクラス data JFReader = mutable native java.io.FileReader where native new :: String -> IO JFReader native read :: JFReader -> IO Int readOneFrom :: String -> IO Int readOneFrom filename = do fr <- JFReader.new filename fr.read IO モナドとして使用
  29. 29. Java の非純粋性の 3 つのレベル ● イミュータブル ○ そのまま Frege のデータ型になる ● ミュータブルだが入出力なし ○ ??? ● 入出力あり ○ IO モナドになる
  30. 30. 「表向き純粋」なメソッド public String greeting(String name) { StringBuilder sb = new StringBuilder(“Hello, ”); sb.append(name); return sb.toString(); }
  31. 31. 「表向き純粋」なメソッド public String greeting(String name) { StringBuilder sb = new StringBuilder(“Hello, ”); sb.append(name); return sb.toString(); } インスタンスの破壊的更新
  32. 32. 「表向き純粋」なメソッド public String greeting(String name) { StringBuilder sb = new StringBuilder(“Hello, ”); sb.append(name); return sb.toString(); } ただし引数と戻り値の関係は一定
  33. 33. ST モナドを使おう!
  34. 34. Java の非純粋性の 3 つのレベル ● イミュータブル ○ そのまま Frege のデータ型になる ● ミュータブルだが入出力なし ○ ST モナドになる ● 入出力あり ○ IO モナドになる
  35. 35. ST (State Transformer) モナド ● 破壊的更新を局所化できる ● ST s TypeName ○ s は「観測不可能」な内部状態 ○ s は常に型変数で、アクセスできない ● 純粋な値を取り出せる ○ IO モナドでは取り出せない
  36. 36. ミュータブルなクラス data JBuilder = native java.lang.StringBuilder where native new :: String -> ST s (Mutable s JBuilder) native append :: Mutable s JBuilder -> String -> ST s (Mutable s JBuilder)
  37. 37. ミュータブルなクラス data JBuilder = native java.lang.StringBuilder where native new :: String -> ST s (Mutable s JBuilder) native append :: Mutable s JBuilder -> String -> ST s (Mutable s JBuilder) 入出力なしなら native のみ
  38. 38. ミュータブルなクラス data JBuilder = native java.lang.StringBuilder where native new :: String -> ST s (Mutable s JBuilder) native append :: Mutable s JBuilder -> String -> ST s (Mutable s JBuilder) 直接アクセス不可能な「状態」
  39. 39. ミュータブルなクラス data JBuilder = native java.lang.StringBuilder where native new :: String -> ST s (Mutable s JBuilder) native append :: Mutable s JBuilder -> String -> ST s (Mutable s JBuilder) Mutable s でラップ
  40. 40. ミュータブルなクラス data JBuilder = native java.lang.StringBuilder where native new :: String -> ST s (Mutable s JBuilder) native append :: Mutable s JBuilder -> String -> ST s (Mutable s JBuilder) 戻り値は ST モナド
  41. 41. ミュータブルなクラス greeting :: String -> ST s String greeting name = do sb <- JBuilder.new “Hello, ” sb.append name sb.toString pureFunc :: String -> String pureFunc name = (greeting name).run
  42. 42. ミュータブルなクラス greeting :: String -> ST s String greeting name = do sb <- JBuilder.new “Hello, ” sb.append name sb.toString pureFunc :: String -> String pureFunc name = (greeting name).run ST モナドとして使用
  43. 43. ミュータブルなクラス greeting :: String -> ST s String greeting name = do sb <- JBuilder.new “Hello, ” sb.append name sb.toString pureFunc :: String -> String pureFunc name = (greeting name).run run で純粋な値を取り出す
  44. 44. ミュータブルなクラス greeting :: String -> ST s String greeting name = do sb <- JBuilder.new “Hello, ” sb.append name sb.toString pureFunc :: String -> String pureFunc name = (greeting name).run 純粋関数の中で使用可能
  45. 45. まとめ ● Frege はまさに JVM のための Haskell ○ 文法は Haskell そのまま ○ 学習コストはほぼゼロ ● エレガントな Java 呼び出し ○ Haskell 的な型システムと両立 ○ pure, ST, IO の 3 段階で副作用の強さを表現
  46. 46. Have a Nice Frege Coding! Presented by チェシャ猫 (@y_taka_23)

×