Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

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

6 193 vues

Publié le

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

Publié dans : Technologie
  • Identifiez-vous pour voir les commentaires

すごい 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)

×