SlideShare a Scribd company logo
1 of 124
Download to read offline
思ったほど怖くない!
Haskell on JVM
超入門
チェシャ猫 (@y_taka_23)
JJUG CCC 2017 Spring (2017/05/20)
#jjug_ccc
#ccc_l8
Haskell
https://www.haskell.org
#ccc_l8
本日の目次
1. はじめまして Haskell
2. Haskell on JVM: Frege vs Eta
a. モナドの内幕
b. Java 呼び出し、それぞれの戦略
3. 素敵な Haskell 生活の始め方
#ccc_l8
1
はじめまして Haskell
Haskell は何を目指して
作られた言語なのか?
Hello, Haskell!
module Hello where
greeting :: String -> String
greeting name = “Hello, “ ++ name
main :: IO ()
main = do
putStrLn $ greeting “Haskell”
putStrLn “Nice to meet you!”
#ccc_l8
「型」に注目してみる
#ccc_l8
Haskell による Hello, World!
module Hello where
greeting :: String -> String
greeting name = “Hello, “ ++ name
main :: IO ()
main = do
putStrLn $ greeting “Haskell”
putStrLn “Nice to meet you!”
“::” で型を記述する
#ccc_l8
Haskell による Hello, World!
module Hello where
greeting :: String -> String
greeting name = “Hello, “ ++ name
main :: IO ()
main = do
putStrLn $ greeting “Haskell”
putStrLn “Nice to meet you!”
String から String への関数
#ccc_l8
Haskell による Hello, World!
module Hello where
greeting :: String -> String
greeting name = “Hello, “ ++ name
main :: IO ()
main = do
putStrLn $ greeting “Haskell”
putStrLn “Nice to meet you!”
Unit: Java の void 相当
#ccc_l8
Haskell による Hello, World!
module Hello where
greeting :: String -> String
greeting name = “Hello, “ ++ name
main :: IO ()
main = do
putStrLn $ greeting “Haskell”
putStrLn “Nice to meet you!”
???
#ccc_l8
純粋性
Purity
#ccc_l8
Haskell の「厄介な」ところ
▪ Java のような変数がない
▫ 変数に再代入できない
▫ Setter もなく、値は作成時から不変
▪ 関数は引数以外の情報を使えない
▫ 引数が同じなら戻り値も常に同じ
▫ ただし完全に純粋な関数だけだと、意味のある
プログラムが書けない
#ccc_l8
Haskell による Hello, World!
module Hello where
greeting :: String -> String
greeting name = “Hello, “ ++ name
main :: IO ()
main = do
putStrLn $ greeting “Haskell”
putStrLn “Nice to meet you!”
???
#ccc_l8
Haskell による Hello, World!
module Hello where
greeting :: String -> String
greeting name = “Hello, “ ++ name
main :: IO ()
main = do
putStrLn $ greeting “Haskell”
putStrLn “Nice to meet you!”
「プログラム外への入出力を行う」型
#ccc_l8
Haskell の「頼もしい」ところ
▪ 他の言語では、副作用が予測不能
▫ そもそも入出力は言語問わず隔離すべき
▫ 外界への依存は制御不能、テスタブルでない
▫ しかしそれを検知する手段がない
▪ Haskell では型として現れる
▫ 変なところで入出力を書こうとしても無理
▫ 設計者の技量ではなく、コンパイラが保証
#ccc_l8
Section 1 のまとめ
▪ 純粋性が大きな特徴
▫ あらゆるものが Immutable な世界
▫ 関数の戻り値は引数のみから定まる
▪ 型が持つ情報量が多い
▫ 純粋な関数内では外界の情報が使えない
▫ 制御不可能な副作用に汚染されにくい
#ccc_l8
2
Haskell on JVM:
Frege vs Eta
Haskell 互換 JVM 言語
それぞれの特徴とは?
Frege
http://frege-lang.org
#ccc_l8
Frege はどんな言語なのか?
▪ Ingo Wechsung 氏が開発の中心
▫ 2012 年 8 月に現在の v3 系がリリース
▪ Frege コンパイラ自身も Frege で実装
▫ Haskell 2010 相当のコードに対応
▫ コンパイラ拡張は対応の予定なし
▪ Java ソースコードを生成
▫ Haskell の機能を Java で再現することに主眼
#ccc_l8
Eta
http://eta-lang.org
#ccc_l8
Eta はどんな言語なのか?
▪ TypeLead 社が開発の中心
▫ 2017 年の 3 月に初リリース
▫ かなりのハイペースで進化中
▪ Haskell のデファクトスタンダードな
コンパイラ GHC をフォーク
▫ GHC 拡張が使用可能
▪ 直接、クラスファイルを生成
#ccc_l8
JVM 言語としての視点から
▪ プラットフォームに依存しない
▫ 30 億のデバイスで動く
▪ Java のライブラリ呼び出しが可能
▫ 既存の資産が再利用可能
▪ しかし副作用に関する考え方が異なる
▫ Haskell (Frege, Eta): 純粋
▫ Java: 非純粋、オブジェクトが状態を持つ
#ccc_l8
Haskell の純粋性を保ったまま
Java のライブラリを呼び出すには?
#ccc_l8
モナド
Monads
#ccc_l8
モナド・コトハジメ
▪ モナドとは何か
▫ 式の「つなぎ方」を定義する仕組み
▫ Java でいえばインタフェースの一種
▪ 数学・圏論を理解しないと使えない?
▫ 使うだけなら理論面は後回しで OK
▫ Step by Step で 理解しよう!
#ccc_l8
(>>=) :: m a -> (a -> m b) -> m b
#ccc_l8
なるほどわからん
#ccc_l8
Step by Step で考えるモナド
#ccc_l8
「状態」のトイモデル
▪ スタックに対する操作を考える
▫ オブジェクトの内部状態に見立てる
▪ できるだけ単純化
▫ 要素は Int 型のみ
▫ pop: スタック先頭の整数を取得
▫ push x: スタックに整数 x を積む
▪ 純粋な Haskell で実装できるか?
#ccc_l8
最初に思いつく Haskell プログラム
type Stack = [Int]
pop :: Stack -> Int
pop (x : xs) = x
push :: Int -> Stack -> Stack
push x xs = x : xs
#ccc_l8
最初に思いつく Haskell プログラム
type Stack = [Int]
pop :: Stack -> Int
pop (x : xs) = x
push :: Int -> Stack -> Stack
push x xs = x : xs
型に別名(シノニム)をつけられる
#ccc_l8
最初に思いつく Haskell プログラム
type Stack = [Int]
pop :: Stack -> Int
pop (x : xs) = x
push :: Int -> Stack -> Stack
push x xs = x : xs
Int 型の連結リスト
#ccc_l8
最初に思いつく Haskell プログラム
type Stack = [Int]
pop :: Stack -> Int
pop (x : xs) = x
push :: Int -> Stack -> Stack
push x xs = x : xs
”:” で連結リストの先頭と残りを連結
#ccc_l8
スタックに対する操作
▪ 連続して操作したい
▫ 前の操作が次の操作の前提となる
▪ 操作した後の状態も明示的に返す
▫ 純粋性の枠内で可能
▫ Stack -> (a, Stack)
▫ 戻り値の a は操作した結果得られる値の型、
Stack は変化後の状態
#ccc_l8
変化後の状態も明示的に返す
type Action a = Stack -> (a, Stack)
pop :: Action Int
pop (x : xs) = (x, xs)
push :: Int -> Action ()
push x xs = ((), (x : xs))
#ccc_l8
変化後の状態も明示的に返す
type Action a = Stack -> (a, Stack)
pop :: Action Int
pop (x : xs) = (x, xs)
push :: Int -> Action ()
push x xs = ((), (x : xs))
a 型の値を返すスタックの操作を表す型
#ccc_l8
変化後の状態も明示的に返す
type Action a = Stack -> (a, Stack)
pop :: Action Int
pop (x : xs) = (x, xs)
push :: Int -> Action ()
push x xs = ((), (x : xs))
変化後のスタック
#ccc_l8
変化後の状態も明示的に返す
type Action a = Stack -> (a, Stack)
pop :: Action Int
pop (x : xs) = (x, xs)
push :: Int -> Action ()
push x xs = ((), (x : xs))
Unit: Java の void 相当
#ccc_l8
変化後の状態も明示的に返す
addTop2 :: Action ()
addTop2 stack =
let (x1, stack1) = pop stack
(x2, stack2) = pop stack1
in push (x1 + x2) stack2
スタックのトップ 2 個を加算
#ccc_l8
変化後の状態も明示的に返す
addTop2 :: Action ()
addTop2 stack =
let (x1, stack1) = pop stack
(x2, stack2) = pop stack1
in push (x1 + x2) stack2
1 回目の操作の結果を保持
#ccc_l8
変化後の状態も明示的に返す
addTop2 :: Action ()
addTop2 stack =
let (x1, stack1) = pop stack
(x2, stack2) = pop stack1
in push (x1 + x2) stack2
1 回目の結果に対して 2 回目の操作
#ccc_l8
変化後の状態も明示的に返す
addTop2 :: Action ()
addTop2 stack =
let (x1, stack1) = pop stack
(x2, stack2) = pop stack1
in push (x1 + x2) stack2
2 回目の結果に対して 3 回目の操作
#ccc_l8
アクションの連結
▪ 変化後の状態を合わせて渡す
▫ pop と push がつながるようになった
▫ つなげた結果も Action 型になっている
▪ もう少し一般的な形で書きたい
▫ 複数の Action 型の値をつなげたい
▫ つなげた結果も Action 型になるように
#ccc_l8
アクションの連結
andThen :: Action a -> Action b
-> Action b
andThen act1 act2 stack =
let (x1, stack1) = act1 stack
(x2, stack2) = act2 stack1
in (x2, stack2)
#ccc_l8
アクションの連結
andThen :: Action a -> Action b
-> Action b
andThen act1 act2 stack =
let (x1, stack1) = act1 stack
(x2, stack2) = act2 stack1
in (x2, stack2)
act1 の結果を保持
#ccc_l8
アクションの連結
andThen :: Action a -> Action b
-> Action b
andThen act1 act2 stack =
let (x1, stack1) = act1 stack
(x2, stack2) = act2 stack1
in (x2, stack2)
その結果に対して act2 を行う
#ccc_l8
アクションの連結
andThen :: Action a -> Action b
-> Action b
andThen act1 act2 stack =
let (x1, stack1) = act1 stack
(x2, stack2) = act2 stack1
in (x2, stack2)
x1 の情報が引き継がれない
#ccc_l8
値の情報を後で使えるようにする
andThen :: Action a -> (a -> Action b)
-> Action b
andThen act1 factory stack =
let (x1, stack1) = act1 stack
(x2, stack2) = (factory x1) stack1
in (x2, stack2)
#ccc_l8
値の情報を後で使えるようにする
andThen :: Action a -> (a -> Action b)
-> Action b
andThen act1 factory stack =
let (x1, stack1) = act1 stack
(x2, stack2) = (factory x1) stack1
in (x2, stack2)
第 2 引数をパラメータ化
#ccc_l8
値の情報を後で使えるようにする
andThen :: Action a -> (a -> Action b)
-> Action b
andThen act1 factory stack =
let (x1, stack1) = act1 stack
(x2, stack2) = (factory x1) stack1
in (x2, stack2)
1 回目の操作の結果を保持した後で
#ccc_l8
値の情報を後で使えるようにする
andThen :: Action a -> (a -> Action b)
-> Action b
andThen act1 factory stack =
let (x1, stack1) = act1 stack
(x2, stack2) = (factory x1) stack1
in (x2, stack2)
1 回目の戻り値を使って 2 回目の操作を確定
#ccc_l8
値の情報を後で使えるようにする
andThen :: Action a -> (a -> Action b)
-> Action b
andThen act1 factory stack =
let (x1, stack1) = act1 stack
(x2, stack2) = (factory x1) stack1
in (x2, stack2)
できた操作を 1 回目の結果に適用
#ccc_l8
アクションがうまく連結可能に!
addTop2 :: Action ()
addTop2 =
pop `andThen` (x1 ->
pop `andThen` (x2 ->
push (x1 + x2)))
addTop4 :: Action ()
addTop4 =
addTop2 `andThen` (sum1 ->
addTop2 `andThen` (sum2 ->
push (sum1 + sum2)))
#ccc_l8
andThen :: Action a -> (a -> Action b)
-> Action b
#ccc_l8
(>>=) :: m a -> (a -> m b) -> m b
#ccc_l8
モナドの正体見たり
▪ モナドはインタフェース的な存在
▫ andThen に似た (>>=) が要求される
▫ 式の「つなぎ方」を規定する
▪ 情報として何を受け渡すかは実装による
▫ IO は RealWorld を「状態」とするモナド
▪ ただし記述がやや冗長
▫ いわゆる「コールバック地獄」的な状況に
#ccc_l8
do 記法
do Notation
#ccc_l8
do 記法による「手続き型」スタイル
addTop2 :: Action ()
addTop2 =
pop >>= (x1 ->
pop >>= (x2 ->
push (x1 + x2)))
#ccc_l8
do 記法による「手続き型」スタイル
addTop2 :: Action ()
addTop2 = do
x1 <- pop
x2 <- pop
push (x1 + x2)
#ccc_l8
do 記法による「手続き型」スタイル
addTop2 :: Action ()
addTop2 = do
x1 <- pop
x2 <- pop
push (x1 + x2)
あたかも代入っぽく書ける
モナドの正体見たり
▪ モナドはインタフェースの一種
▫ andThen に似た (>>=) が要求される
▫ 式の「つなぎ方」を規定する
▪ 情報として何を受け渡すかは実装による
▫ IO は RealWorld を「状態」とするモナド
▪ do 記法によるシンタックスシュガー
▫ モナドにすると簡潔に書ける
#ccc_l8
Frege の戦略
副作用をレベル分けする
#ccc_l8
Java の非純粋性の 3 つのレベル
▪ Immutable なクラス
▫ 例 : BigInteger
▪ Mutable だが入出力を行わないクラス
▫ オブジェクトの内部に状態を蓄積
▫ 例 : StringBuilder
▪ 入出力を行うクラス
▫ 例 : FileReader
#ccc_l8
Frege における扱い
▪ Immutable なクラス
▫ そのまま Frege の型になる
▪ Mutable だが入出力を行わないクラス
▫ ???
▪ 入出力を行うクラス
▫ ???
#ccc_l8
Immutable なクラス
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
#ccc_l8
Immutable なクラス
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 側で使う型名
#ccc_l8
Immutable なクラス
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
Immutable なら pure native
#ccc_l8
Immutable なクラス
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 と名付けた関数がコンストラクタに
#ccc_l8
Immutable なクラス
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
#ccc_l8
Immutable なクラス
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
ドットでメソッド呼び出し
#ccc_l8
Frege における扱い
▪ Immutable なクラス
▫ そのまま Frege の型になる
▪ Mutable だが入出力を行わないクラス
▫ ???
▪ 入出力を行うクラス
▫ IO モナドになる
#ccc_l8
入出力を伴うクラス
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
#ccc_l8
入出力を伴うクラス
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 用のクラスは mutable native
#ccc_l8
入出力を伴うクラス
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 モナドに
#ccc_l8
Frege における扱い
▪ Immutable なクラス
▫ そのまま Frege の型になる
▪ Mutable だが入出力を行わないクラス
▫ (ここがJVM 言語としての事情)
▪ 入出力を行うクラス
▫ IO モナドになる
#ccc_l8
「表向き純粋」なメソッド
public String greeting(String name) {
StringBuilder sb =
new StringBuilder(“Hello, “);
sb.append(name);
return sb.toString();
}
#ccc_l8
「表向き純粋」なメソッド
public String greeting(String name) {
StringBuilder sb =
new StringBuilder(“Hello, “);
sb.append(name);
return sb.toString();
}
インスタンスの破壊的更新
#ccc_l8
「表向き純粋」なメソッド
public String greeting(String name) {
StringBuilder sb =
new StringBuilder(“Hello, “);
sb.append(name);
return sb.toString();
}
しかし戻り値は引数のみから定まる
#ccc_l8
STモナドを使おう!
#ccc_l8
ST (State Transformer) モナド
▪ 破壊的更新を局所化
▫ 実際にメモリ上の値を書き換える
▪ ST s TypeName
▫ s は「観測不可能」な内部状態
▫ s は常に型変数で、具体化できない
▪ 純粋な値を取り出すことができる
▫ IO モナドでは値の取り出しは不可能
#ccc_l8
Mutable なクラス
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)
#ccc_l8
Mutable なクラス
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 のみ
#ccc_l8
Mutable なクラス
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)
外部から「観測不可能」な内部状態
#ccc_l8
Mutable なクラス
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 でラップ
#ccc_l8
Mutable なクラス
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 モナド
#ccc_l8
Mutable なクラス
greeting :: String -> ST s String
greeting name = do
sb <- JBuilder.new “Hello, ”
sb.append name
sb.toString
pureGreeting :: String -> String
pureGreeting name = (greeting name).run
#ccc_l8
Mutable なクラス
greeting :: String -> ST s String
greeting name = do
sb <- JBuilder.new “Hello, ”
sb.append name
sb.toString
pureGreeting :: String -> String
pureGreeting name = (greeting name).run
ST モナドとして使用
#ccc_l8
Mutable なクラス
greeting :: String -> ST s String
greeting name = do
sb <- JBuilder.new “Hello, ”
sb.append name
sb.toString
pureGreeting :: String -> String
pureGreeting name = (greeting name).run
run で純粋な値を取り出す
#ccc_l8
Mutable なクラス
greeting :: String -> ST s String
greeting name = do
sb <- JBuilder.new “Hello, ”
sb.append name
sb.toString
pureGreeting :: String -> String
pureGreeting name = (greeting name).run
外から見ると純粋な関数
#ccc_l8
Frege における扱い
▪ Immutable なクラス
▫ そのまま Frege の型になる
▪ Mutable だが入出力を行わないクラス
▫ ST モナドになる
▪ 入出力を行うクラス
▫ IO モナドになる
#ccc_l8
Eta の戦略
メソッドレシーバを状態だと考える
#ccc_l8
Java モナド
▪ Eta 独自の仕組み
▫ フレームワークとしてモナドを利用
▪ Java a b
▫ a はレシーバ、b は戻り値の型
▫ a 型の値に対してメソッドの並びを呼び出すと、
結果として b 型の値が得られる
▫ クラスの数だけ別種のモナドができる
#ccc_l8
Java のインポート
data {-# CLASS “java.io.File” #-} File =
File (Object# File)
deriving Class
foreign import java unsafe
canExecute :: Java File Bool
foreign import java unsafe “@new”
newFile :: String -> Java a File
#ccc_l8
Java のインポート
data {-# CLASS “java.io.File” #-} File =
File (Object# File)
deriving Class
foreign import java unsafe
canExecute :: Java File Bool
foreign import java unsafe “@new”
newFile :: String -> Java a File
書式はどのクラスも同じ
#ccc_l8
Java のインポート
data {-# CLASS “java.io.File” #-} File =
File (Object# File)
deriving Class
foreign import java unsafe
canExecute :: Java File Bool
foreign import java unsafe “@new”
newFile :: String -> Java a File
レシーバが File 型、戻り値が Bool 型
#ccc_l8
Java のインポート
data {-# CLASS “java.io.File” #-} File =
File (Object# File)
deriving Class
foreign import java unsafe
canExecute :: Java File Bool
foreign import java unsafe “@new”
newFile :: String -> Java a File
コンストラクタには “@new” がつく
#ccc_l8
複数のモナドを組み合わせる!
#ccc_l8
Java アクションをつなぐ関数
▪ java :: Java a b -> IO b
▫ Java モナドを IO モナドの中に埋め込む
▪ Io :: IO b -> Java a b
▫ IO モナドを Java モナドの中に埋め込む
#ccc_l8
Java アクションをつなぐ関数
▪ (>-) :: Java a b -> Java b c ->
-> Java a c
▫ Java モナド同士をつなぐ
▫ 前半のアクションの戻り値が、後半のアクションの
レシーバになる
#ccc_l8
複数のモナドを組み立てる
main :: IO ()
main = java $ do
isExec <- newFile “./dir/app.sh”
>- canExecute
io $ putStrLn “Checking”
if isExec
then io $ putStrLn “It’s OK!”
else io $ putStrLn “Too Bad...”
#ccc_l8
複数のモナドを組み立てる
main :: IO ()
main = java $ do
isExec <- newFile “./dir/app.sh”
>- canExecute
io $ putStrLn “Checking”
if isExec
then io $ putStrLn “It’s OK!”
else io $ putStrLn “Too Bad...”
全体としては IO モナド
#ccc_l8
複数のモナドを組み立てる
main :: IO ()
main = java $ do
isExec <- newFile “./dir/app.sh”
>- canExecute
io $ putStrLn “Checking”
if isExec
then io $ putStrLn “It’s OK!”
else io $ putStrLn “Too Bad...”
そのすぐ内側は Java モナド
#ccc_l8
複数のモナドを組み立てる
main :: IO ()
main = java $ do
isExec <- newFile “./dir/app.sh”
>- canExecute
io $ putStrLn “Checking”
if isExec
then io $ putStrLn “It’s OK!”
else io $ putStrLn “Too Bad...”
Java a File 型の Java アクション
#ccc_l8
複数のモナドを組み立てる
main :: IO ()
main = java $ do
isExec <- newFile “./dir/app.sh”
>- canExecute
io $ putStrLn “Checking”
if isExec
then io $ putStrLn “It’s OK!”
else io $ putStrLn “Too Bad...”
Java File Bool 型の Java アクション
#ccc_l8
複数のモナドを組み立てる
main :: IO ()
main = java $ do
isExec <- newFile “./dir/app.sh”
>- canExecute
io $ putStrLn “Checking”
if isExec
then io $ putStrLn “It’s OK!”
else io $ putStrLn “Too Bad...”
戻り値だった File 型の値が次のレシーバに
#ccc_l8
複数のモナドを組み立てる
main :: IO ()
main = java $ do
isExec <- newFile “./dir/app.sh”
>- canExecute
io $ putStrLn “Checking”
if isExec
then io $ putStrLn “It’s OK!”
else io $ putStrLn “Too Bad...”
IO モナドが
#ccc_l8
複数のモナドを組み立てる
main :: IO ()
main = java $ do
isExec <- newFile “./dir/app.sh”
>- canExecute
io $ putStrLn “Checking”
if isExec
then io $ putStrLn “It’s OK!”
else io $ putStrLn “Too Bad...”
Java モナドに埋め込まれる
#ccc_l8
Section 2 のまとめ
▪ モナドはインタフェース的な存在
▫ 純粋性を保ったまま状態を表現
▫ do 記法による言語自体のサポート
▪ Frege: pure, ST, IO によるモデル化
▫ 副作用の「強さ」でレベル分け
▪ Eta: Java モナドによるモデル化
▫ IO も含め、複数種類のモナドを組み合わせる
#ccc_l8
3
素敵な Haskell 生活の始め方
最初の一歩を踏み出すための
ツール・教材たち
結局、Frege と Eta なら
どっちがオススメ?
#ccc_l8
両言語のターゲット層
▪ Frege: Javaer のための Haskell
▫ あくまでも標準 Haskell 互換機能のみ
▫ Java 呼び出しが比較的シンプル
▪ Eta: Haskeller 向けの JVM 言語
▫ GHC 拡張が使用可能
▫ Java の呼び出しがやや複雑
■ モナドの組み合わせが必須
#ccc_l8
ビルドまでのセットアップ
▪ Frege
▫ 既存の Java ビルドツールを使用
■ Gradle, Maven, sbt, leiningen etc
▫ コンパイラはプラグインとして提供
▪ Eta
▫ 専用ツール Etlas を使用
▫ コンパイラ自体のコンパイルからスタート
#ccc_l8
本日のオススメ
http://frege-lang.org
#ccc_l8
オススメ参考書、その一
#ccc_l8
すごい Haskell たのしく学ぼう!
▪ Haskell 入門書の定番
▫ Web 版は無料公開
▫ モナドの説明がわかりやすい
▪ 『すごい Frege』もある
▫ Web 版の全サンプルコードを移植
▫ https://github.com/y-taka-23/learn-you-
a-frege
#ccc_l8
オススメ参考書、その二
#ccc_l8
Frege Goodness
▪ Javaer 向けの短い記事集
▫ GitBook で無料公開
▫ https://www.gitbook.com/book/dierk/freg
egoodness
▪ 日本語版あり
▫ https://www.gitbook.com/book/y-taka-23/
frege-goodness-jp
#ccc_l8
日本 Haskell ユーザ会
▪ 通称 Haskell-jp
▫ 2017 年 3 月に発足したて
▪ もくもく会
▫ 月 1 回ペースで開催中 @ 東銀座
▫ 初心者歓迎、一見さん歓迎
▪ Slack
▫ https://haskell-jp.slack.com
#ccc_l8
Section 3 のまとめ
▪ はじめての人は Frege から
▫ Frege: Javaer のための Haskell
▫ Eta: Haskeller 向けの JVM 言語
▪ いつものツールでビルド
▪ 勉強の道標はいろいろ
▫ Frege 対応参考書あります
▫ 困ったら Haskell-jp へ
#ccc_l8
4
まとめ
結局、この 45 分間で
我々は何を得たのか?
本日のまとめ
▪ 純粋言語 Haskell
▫ 副作用を予測可能にする型システム
▪ 巧みな Java 呼び出し
▫ Frege: pure, ST, IO によるモデル化
▫ Eta: Java モナドによるモデル化
▪ まず Frege から始めてみよう!
#ccc_l8
Happy Haskelling!
Presented by
チェシャ猫 (@y_taka_23)
#ccc_l8
CREDITS
Special thanks to all the people who made and released
these awesome resources for free:
▪ Presentation template by SlidesCarnival
▪ Photographs by Unsplash

More Related Content

What's hot

AWS Black Belt Techシリーズ AWS Direct Connect
AWS Black Belt Techシリーズ AWS Direct ConnectAWS Black Belt Techシリーズ AWS Direct Connect
AWS Black Belt Techシリーズ AWS Direct ConnectAmazon Web Services Japan
 
Yahoo! JAPANのサービス開発を10倍早くした社内PaaS構築の今とこれから
Yahoo! JAPANのサービス開発を10倍早くした社内PaaS構築の今とこれからYahoo! JAPANのサービス開発を10倍早くした社内PaaS構築の今とこれから
Yahoo! JAPANのサービス開発を10倍早くした社内PaaS構築の今とこれからYahoo!デベロッパーネットワーク
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことAmazon Web Services Japan
 
AWS における Microservices Architecture と DevOps を推進する組織と人とツール
AWS における Microservices Architecture と DevOps を推進する組織と人とツールAWS における Microservices Architecture と DevOps を推進する組織と人とツール
AWS における Microservices Architecture と DevOps を推進する組織と人とツールAmazon Web Services Japan
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Kohei Tokunaga
 
20200722 AWS Black Belt Online Seminar AWSアカウント シングルサインオンの設計と運用
20200722 AWS Black Belt Online Seminar AWSアカウント シングルサインオンの設計と運用20200722 AWS Black Belt Online Seminar AWSアカウント シングルサインオンの設計と運用
20200722 AWS Black Belt Online Seminar AWSアカウント シングルサインオンの設計と運用Amazon Web Services Japan
 
root権限無しでKubernetesを動かす
root権限無しでKubernetesを動かす root権限無しでKubernetesを動かす
root権限無しでKubernetesを動かす Akihiro Suda
 
[AWS初心者向けWebinar] 利用者が実施するAWS上でのセキュリティ対策
[AWS初心者向けWebinar] 利用者が実施するAWS上でのセキュリティ対策[AWS初心者向けWebinar] 利用者が実施するAWS上でのセキュリティ対策
[AWS初心者向けWebinar] 利用者が実施するAWS上でのセキュリティ対策Amazon Web Services Japan
 
Open Service Broker APIとKubernetes Service Catalog #k8sjp
Open Service Broker APIとKubernetes Service Catalog #k8sjpOpen Service Broker APIとKubernetes Service Catalog #k8sjp
Open Service Broker APIとKubernetes Service Catalog #k8sjpToshiaki Maki
 
AWS Black Belt Online Seminar AWS上のJenkins活用方法
AWS Black Belt Online Seminar AWS上のJenkins活用方法AWS Black Belt Online Seminar AWS上のJenkins活用方法
AWS Black Belt Online Seminar AWS上のJenkins活用方法Amazon Web Services Japan
 
Serverless Architecture on AWS
Serverless Architecture on AWSServerless Architecture on AWS
Serverless Architecture on AWSRajind Ruparathna
 
Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)
Apache Airflow入門  (マーケティングデータ分析基盤技術勉強会)Apache Airflow入門  (マーケティングデータ分析基盤技術勉強会)
Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)Takeshi Mikami
 
そのRails Engine、 本当に必要ですか?
そのRails Engine、 本当に必要ですか?そのRails Engine、 本当に必要ですか?
そのRails Engine、 本当に必要ですか?nixiesan
 
Kuberneteの運用を支えるGitOps
Kuberneteの運用を支えるGitOpsKuberneteの運用を支えるGitOps
Kuberneteの運用を支えるGitOpsshunki fujiwara
 
202110 AWS Black Belt Online Seminar AWS Site-to-Site VPN
202110 AWS Black Belt Online Seminar AWS Site-to-Site VPN202110 AWS Black Belt Online Seminar AWS Site-to-Site VPN
202110 AWS Black Belt Online Seminar AWS Site-to-Site VPNAmazon Web Services Japan
 
これで怖くない!?大規模環境で体験するDB負荷対策~垂直から水平の彼方へ~
これで怖くない!?大規模環境で体験するDB負荷対策~垂直から水平の彼方へ~これで怖くない!?大規模環境で体験するDB負荷対策~垂直から水平の彼方へ~
これで怖くない!?大規模環境で体験するDB負荷対策~垂直から水平の彼方へ~hideakikabuto
 

What's hot (20)

AWS Black Belt Techシリーズ AWS Direct Connect
AWS Black Belt Techシリーズ AWS Direct ConnectAWS Black Belt Techシリーズ AWS Direct Connect
AWS Black Belt Techシリーズ AWS Direct Connect
 
Yahoo! JAPANのサービス開発を10倍早くした社内PaaS構築の今とこれから
Yahoo! JAPANのサービス開発を10倍早くした社内PaaS構築の今とこれからYahoo! JAPANのサービス開発を10倍早くした社内PaaS構築の今とこれから
Yahoo! JAPANのサービス開発を10倍早くした社内PaaS構築の今とこれから
 
AWS Black Belt Online Seminar AWS Amplify
AWS Black Belt Online Seminar AWS AmplifyAWS Black Belt Online Seminar AWS Amplify
AWS Black Belt Online Seminar AWS Amplify
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
 
AWS における Microservices Architecture と DevOps を推進する組織と人とツール
AWS における Microservices Architecture と DevOps を推進する組織と人とツールAWS における Microservices Architecture と DevOps を推進する組織と人とツール
AWS における Microservices Architecture と DevOps を推進する組織と人とツール
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
Serverless時代のJavaについて
Serverless時代のJavaについてServerless時代のJavaについて
Serverless時代のJavaについて
 
20200722 AWS Black Belt Online Seminar AWSアカウント シングルサインオンの設計と運用
20200722 AWS Black Belt Online Seminar AWSアカウント シングルサインオンの設計と運用20200722 AWS Black Belt Online Seminar AWSアカウント シングルサインオンの設計と運用
20200722 AWS Black Belt Online Seminar AWSアカウント シングルサインオンの設計と運用
 
root権限無しでKubernetesを動かす
root権限無しでKubernetesを動かす root権限無しでKubernetesを動かす
root権限無しでKubernetesを動かす
 
[AWS初心者向けWebinar] 利用者が実施するAWS上でのセキュリティ対策
[AWS初心者向けWebinar] 利用者が実施するAWS上でのセキュリティ対策[AWS初心者向けWebinar] 利用者が実施するAWS上でのセキュリティ対策
[AWS初心者向けWebinar] 利用者が実施するAWS上でのセキュリティ対策
 
Open Service Broker APIとKubernetes Service Catalog #k8sjp
Open Service Broker APIとKubernetes Service Catalog #k8sjpOpen Service Broker APIとKubernetes Service Catalog #k8sjp
Open Service Broker APIとKubernetes Service Catalog #k8sjp
 
AWS Black Belt Online Seminar AWS上のJenkins活用方法
AWS Black Belt Online Seminar AWS上のJenkins活用方法AWS Black Belt Online Seminar AWS上のJenkins活用方法
AWS Black Belt Online Seminar AWS上のJenkins活用方法
 
Serverless Architecture on AWS
Serverless Architecture on AWSServerless Architecture on AWS
Serverless Architecture on AWS
 
Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)
Apache Airflow入門  (マーケティングデータ分析基盤技術勉強会)Apache Airflow入門  (マーケティングデータ分析基盤技術勉強会)
Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)
 
そのRails Engine、 本当に必要ですか?
そのRails Engine、 本当に必要ですか?そのRails Engine、 本当に必要ですか?
そのRails Engine、 本当に必要ですか?
 
OSSを活用したIaCの実現
OSSを活用したIaCの実現OSSを活用したIaCの実現
OSSを活用したIaCの実現
 
Kuberneteの運用を支えるGitOps
Kuberneteの運用を支えるGitOpsKuberneteの運用を支えるGitOps
Kuberneteの運用を支えるGitOps
 
202110 AWS Black Belt Online Seminar AWS Site-to-Site VPN
202110 AWS Black Belt Online Seminar AWS Site-to-Site VPN202110 AWS Black Belt Online Seminar AWS Site-to-Site VPN
202110 AWS Black Belt Online Seminar AWS Site-to-Site VPN
 
GraphQL入門 (AWS AppSync)
GraphQL入門 (AWS AppSync)GraphQL入門 (AWS AppSync)
GraphQL入門 (AWS AppSync)
 
これで怖くない!?大規模環境で体験するDB負荷対策~垂直から水平の彼方へ~
これで怖くない!?大規模環境で体験するDB負荷対策~垂直から水平の彼方へ~これで怖くない!?大規模環境で体験するDB負荷対策~垂直から水平の彼方へ~
これで怖くない!?大規模環境で体験するDB負荷対策~垂直から水平の彼方へ~
 

Viewers also liked

2017spring jjug ccc_f2
2017spring jjug ccc_f22017spring jjug ccc_f2
2017spring jjug ccc_f2Kazuhiro Wada
 
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3 データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3 Hiroshi Ito
 
Kotlin is charming; The reasons Java engineers should start Kotlin.
Kotlin is charming; The reasons Java engineers should start Kotlin.Kotlin is charming; The reasons Java engineers should start Kotlin.
Kotlin is charming; The reasons Java engineers should start Kotlin.JustSystems Corporation
 
VMの歩む道。 Dalvik、ART、そしてJava VM
VMの歩む道。 Dalvik、ART、そしてJava VMVMの歩む道。 Dalvik、ART、そしてJava VM
VMの歩む道。 Dalvik、ART、そしてJava VMyy yank
 
U-NEXT学生インターン、過激なJavaの学び方と過激な要求
U-NEXT学生インターン、過激なJavaの学び方と過激な要求U-NEXT学生インターン、過激なJavaの学び方と過激な要求
U-NEXT学生インターン、過激なJavaの学び方と過激な要求hajime funaki
 
Jjugccc2017spring-postgres-ccc_m1
Jjugccc2017spring-postgres-ccc_m1Jjugccc2017spring-postgres-ccc_m1
Jjugccc2017spring-postgres-ccc_m1Kosuke Kida
 
Arachne Unweaved (JP)
Arachne Unweaved (JP)Arachne Unweaved (JP)
Arachne Unweaved (JP)Ikuru Kanuma
 
Java libraries you can't afford to miss
Java libraries you can't afford to missJava libraries you can't afford to miss
Java libraries you can't afford to missAndres Almiray
 
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~Hiroyuki Ohnaka
 
Polyglot on the JVM with Graal (English)
Polyglot on the JVM with Graal (English)Polyglot on the JVM with Graal (English)
Polyglot on the JVM with Graal (English)Logico
 
SpotBugs(FindBugs)による 大規模ERPのコード品質改善
SpotBugs(FindBugs)による 大規模ERPのコード品質改善SpotBugs(FindBugs)による 大規模ERPのコード品質改善
SpotBugs(FindBugs)による 大規模ERPのコード品質改善Works Applications
 
新卒2年目から始めるOSSのススメ~明日からできるコミットデビュー~
新卒2年目から始めるOSSのススメ~明日からできるコミットデビュー~新卒2年目から始めるOSSのススメ~明日からできるコミットデビュー~
新卒2年目から始めるOSSのススメ~明日からできるコミットデビュー~Yoshio Kajikuri
 
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜JustSystems Corporation
 
グラフデータベース入門
グラフデータベース入門グラフデータベース入門
グラフデータベース入門Masaya Dake
 
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...なおき きしだ
 
JJUG CCC 2017 Spring Seasar2からSpringへ移行した俺たちのアプリケーションがマイクロサービスアーキテクチャへ歩み始めた
JJUG CCC 2017 Spring Seasar2からSpringへ移行した俺たちのアプリケーションがマイクロサービスアーキテクチャへ歩み始めたJJUG CCC 2017 Spring Seasar2からSpringへ移行した俺たちのアプリケーションがマイクロサービスアーキテクチャへ歩み始めた
JJUG CCC 2017 Spring Seasar2からSpringへ移行した俺たちのアプリケーションがマイクロサービスアーキテクチャへ歩み始めたKoichi Sakata
 
Introduction of Project Jigsaw
Introduction of Project JigsawIntroduction of Project Jigsaw
Introduction of Project JigsawYuichi Sakuraba
 

Viewers also liked (20)

2017spring jjug ccc_f2
2017spring jjug ccc_f22017spring jjug ccc_f2
2017spring jjug ccc_f2
 
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3 データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
 
Jjug ccc
Jjug cccJjug ccc
Jjug ccc
 
Kotlin is charming; The reasons Java engineers should start Kotlin.
Kotlin is charming; The reasons Java engineers should start Kotlin.Kotlin is charming; The reasons Java engineers should start Kotlin.
Kotlin is charming; The reasons Java engineers should start Kotlin.
 
VMの歩む道。 Dalvik、ART、そしてJava VM
VMの歩む道。 Dalvik、ART、そしてJava VMVMの歩む道。 Dalvik、ART、そしてJava VM
VMの歩む道。 Dalvik、ART、そしてJava VM
 
U-NEXT学生インターン、過激なJavaの学び方と過激な要求
U-NEXT学生インターン、過激なJavaの学び方と過激な要求U-NEXT学生インターン、過激なJavaの学び方と過激な要求
U-NEXT学生インターン、過激なJavaの学び方と過激な要求
 
Jjugccc2017spring-postgres-ccc_m1
Jjugccc2017spring-postgres-ccc_m1Jjugccc2017spring-postgres-ccc_m1
Jjugccc2017spring-postgres-ccc_m1
 
Arachne Unweaved (JP)
Arachne Unweaved (JP)Arachne Unweaved (JP)
Arachne Unweaved (JP)
 
Java libraries you can't afford to miss
Java libraries you can't afford to missJava libraries you can't afford to miss
Java libraries you can't afford to miss
 
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
 
Polyglot on the JVM with Graal (English)
Polyglot on the JVM with Graal (English)Polyglot on the JVM with Graal (English)
Polyglot on the JVM with Graal (English)
 
SpotBugs(FindBugs)による 大規模ERPのコード品質改善
SpotBugs(FindBugs)による 大規模ERPのコード品質改善SpotBugs(FindBugs)による 大規模ERPのコード品質改善
SpotBugs(FindBugs)による 大規模ERPのコード品質改善
 
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
 
新卒2年目から始めるOSSのススメ~明日からできるコミットデビュー~
新卒2年目から始めるOSSのススメ~明日からできるコミットデビュー~新卒2年目から始めるOSSのススメ~明日からできるコミットデビュー~
新卒2年目から始めるOSSのススメ~明日からできるコミットデビュー~
 
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
 
グラフデータベース入門
グラフデータベース入門グラフデータベース入門
グラフデータベース入門
 
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
 
日本Javaグループ2017年定期総会 #jjug
日本Javaグループ2017年定期総会 #jjug 日本Javaグループ2017年定期総会 #jjug
日本Javaグループ2017年定期総会 #jjug
 
JJUG CCC 2017 Spring Seasar2からSpringへ移行した俺たちのアプリケーションがマイクロサービスアーキテクチャへ歩み始めた
JJUG CCC 2017 Spring Seasar2からSpringへ移行した俺たちのアプリケーションがマイクロサービスアーキテクチャへ歩み始めたJJUG CCC 2017 Spring Seasar2からSpringへ移行した俺たちのアプリケーションがマイクロサービスアーキテクチャへ歩み始めた
JJUG CCC 2017 Spring Seasar2からSpringへ移行した俺たちのアプリケーションがマイクロサービスアーキテクチャへ歩み始めた
 
Introduction of Project Jigsaw
Introduction of Project JigsawIntroduction of Project Jigsaw
Introduction of Project Jigsaw
 

Similar to 思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8

x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチMasami Ichikawa
 
並列対決 Elixir × Go × C# x Scala , Node.js
並列対決 Elixir × Go × C# x Scala , Node.js並列対決 Elixir × Go × C# x Scala , Node.js
並列対決 Elixir × Go × C# x Scala , Node.jsYoshiiro Ueno
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」yoshiaki iwanaga
 
Project Loom + Project Panama
Project Loom + Project PanamaProject Loom + Project Panama
Project Loom + Project PanamaYuichi Sakuraba
 
10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!bitter_fox
 
asm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web gamesasm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web gamesNoritada Shimizu
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Ransui Iso
 
Scalamacrosについて
ScalamacrosについてScalamacrosについて
Scalamacrosについてdekosuke
 
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーNode.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーmganeko
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDEdcubeio
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexprGenya Murakami
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜Hiromi Ishii
 

Similar to 思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8 (20)

Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
MoteMote Compiler Plugin
MoteMote Compiler PluginMoteMote Compiler Plugin
MoteMote Compiler Plugin
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチ
 
ATN No.2 Scala事始め
ATN No.2 Scala事始めATN No.2 Scala事始め
ATN No.2 Scala事始め
 
並列対決 Elixir × Go × C# x Scala , Node.js
並列対決 Elixir × Go × C# x Scala , Node.js並列対決 Elixir × Go × C# x Scala , Node.js
並列対決 Elixir × Go × C# x Scala , Node.js
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
 
Project Loom + Project Panama
Project Loom + Project PanamaProject Loom + Project Panama
Project Loom + Project Panama
 
10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!
 
asm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web gamesasm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web games
 
What is Metasepi?
What is Metasepi?What is Metasepi?
What is Metasepi?
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
 
Scalamacrosについて
ScalamacrosについてScalamacrosについて
Scalamacrosについて
 
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーNode.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
 
Objc lambda
Objc lambdaObjc lambda
Objc lambda
 
Rpscala2011 0601
Rpscala2011 0601Rpscala2011 0601
Rpscala2011 0601
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDE
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
 
Ll xcode
Ll xcodeLl xcode
Ll xcode
 
たのしい関数型
たのしい関数型たのしい関数型
たのしい関数型
 

More from y_taka_23

Fission で 始める Containerless Kubernetes #serverlesstokyo
Fission で 始める Containerless Kubernetes #serverlesstokyoFission で 始める Containerless Kubernetes #serverlesstokyo
Fission で 始める Containerless Kubernetes #serverlesstokyoy_taka_23
 
机上の Kubernetes - 形式手法で見るコンテナオーケストレーション #NGK2016B
机上の Kubernetes -  形式手法で見るコンテナオーケストレーション #NGK2016B机上の Kubernetes -  形式手法で見るコンテナオーケストレーション #NGK2016B
机上の Kubernetes - 形式手法で見るコンテナオーケストレーション #NGK2016By_taka_23
 
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfestay_taka_23
 
形式手法で捗る!インフラ構成の設計と検証
形式手法で捗る!インフラ構成の設計と検証形式手法で捗る!インフラ構成の設計と検証
形式手法で捗る!インフラ構成の設計と検証y_taka_23
 
Frege, What a Non-strict Language
Frege, What a Non-strict LanguageFrege, What a Non-strict Language
Frege, What a Non-strict Languagey_taka_23
 
Learn You a Frege for Great Good!
Learn You a Frege for Great Good!Learn You a Frege for Great Good!
Learn You a Frege for Great Good!y_taka_23
 
すごい Frege たのしく学ぼう!
すごい Frege たのしく学ぼう!すごい Frege たのしく学ぼう!
すごい Frege たのしく学ぼう!y_taka_23
 
AWS は形式手法の夢を見るか? - モデル検査器 Alloy によるインフラ設計
AWS は形式手法の夢を見るか? - モデル検査器 Alloy によるインフラ設計AWS は形式手法の夢を見るか? - モデル検査器 Alloy によるインフラ設計
AWS は形式手法の夢を見るか? - モデル検査器 Alloy によるインフラ設計y_taka_23
 
Hello, Type Systems! - Introduction to Featherweight Java
Hello, Type Systems! - Introduction to Featherweight JavaHello, Type Systems! - Introduction to Featherweight Java
Hello, Type Systems! - Introduction to Featherweight Javay_taka_23
 
猫でもわかる! モデル検査器 SPIN 入門
猫でもわかる! モデル検査器 SPIN 入門猫でもわかる! モデル検査器 SPIN 入門
猫でもわかる! モデル検査器 SPIN 入門y_taka_23
 
Alloy ではじめる簡単モデル検査
Alloy ではじめる簡単モデル検査Alloy ではじめる簡単モデル検査
Alloy ではじめる簡単モデル検査y_taka_23
 

More from y_taka_23 (11)

Fission で 始める Containerless Kubernetes #serverlesstokyo
Fission で 始める Containerless Kubernetes #serverlesstokyoFission で 始める Containerless Kubernetes #serverlesstokyo
Fission で 始める Containerless Kubernetes #serverlesstokyo
 
机上の Kubernetes - 形式手法で見るコンテナオーケストレーション #NGK2016B
机上の Kubernetes -  形式手法で見るコンテナオーケストレーション #NGK2016B机上の Kubernetes -  形式手法で見るコンテナオーケストレーション #NGK2016B
机上の Kubernetes - 形式手法で見るコンテナオーケストレーション #NGK2016B
 
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta
 
形式手法で捗る!インフラ構成の設計と検証
形式手法で捗る!インフラ構成の設計と検証形式手法で捗る!インフラ構成の設計と検証
形式手法で捗る!インフラ構成の設計と検証
 
Frege, What a Non-strict Language
Frege, What a Non-strict LanguageFrege, What a Non-strict Language
Frege, What a Non-strict Language
 
Learn You a Frege for Great Good!
Learn You a Frege for Great Good!Learn You a Frege for Great Good!
Learn You a Frege for Great Good!
 
すごい Frege たのしく学ぼう!
すごい Frege たのしく学ぼう!すごい Frege たのしく学ぼう!
すごい Frege たのしく学ぼう!
 
AWS は形式手法の夢を見るか? - モデル検査器 Alloy によるインフラ設計
AWS は形式手法の夢を見るか? - モデル検査器 Alloy によるインフラ設計AWS は形式手法の夢を見るか? - モデル検査器 Alloy によるインフラ設計
AWS は形式手法の夢を見るか? - モデル検査器 Alloy によるインフラ設計
 
Hello, Type Systems! - Introduction to Featherweight Java
Hello, Type Systems! - Introduction to Featherweight JavaHello, Type Systems! - Introduction to Featherweight Java
Hello, Type Systems! - Introduction to Featherweight Java
 
猫でもわかる! モデル検査器 SPIN 入門
猫でもわかる! モデル検査器 SPIN 入門猫でもわかる! モデル検査器 SPIN 入門
猫でもわかる! モデル検査器 SPIN 入門
 
Alloy ではじめる簡単モデル検査
Alloy ではじめる簡単モデル検査Alloy ではじめる簡単モデル検査
Alloy ではじめる簡単モデル検査
 

Recently uploaded

SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 

Recently uploaded (9)

SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 

思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8