SlideShare ist ein Scribd-Unternehmen logo
1 von 27
IdrisでWebアプリを書く
田中英行
@天下一altJS武闘会
自己紹介
• 田中英行(@tanakh)
• Haskellとかやってます
• 「すごいHaskellたのしく学ぼう」翻訳
• 「Parallel and Concurrent Programming in
Haskell」翻訳中
• Idris初心者
Idrisとは?
• http://www.idris-lang.org/
• “Fully Dependent Type” なプログラミング言語
• Cf. CoqとかAgdaとかATSとか
• 純粋関数型
• 正格評価
• 様々な言語へのバックエンド
• C言語
• LLVM
• Java
• JavaScript
処理系のインストール
• $ cabal install idris
$ idris
____ __ _
/ _/___/ /____(_)____
/ // __ / ___/ / ___/ Version 0.9.13
_/ // /_/ / / / (__ ) http://www.idris-lang.org/
/___/__,_/_/ /_/____/ Type :? for help
Idris> █
構文など
• 大体Haskell!
• 基本的な構文
• 型クラスなどなど
• リスト・モナド内包
• モナド記法などなど
Dependent Type (依存型)
• 値に依存した型
• 型のパラメータとして値が取れる
• 型と値の区別があんまりない
• 型に対して計算できる
• ・・・
• 要するにめっちゃ強い型
• 証明とかにも使える
めっちゃ強い型で何するの?
• 証明
• カリー・ハワード同型対応により、
「型の表現力=命題の表現力」
• CoqとかAgdaとかはこっちがメイン
• 安全なプログラムを書く
• 単純により多くのことを型レベルで保証したい
• 例えば、配列のアクセスが範囲を超えないなど
• システムプログラムとかによさそう
• Idrisはこっちが目標っぽい
例:長さを型に持つリスト
data Vect : Nat -> Type -> Type where
Nil : Vect Z a
(::) : a -> Vect k a -> Vect (S k) a
(++) : Vect n a -> Vect m a -> Vect (n + m) a
(++) Nil ys = ys
(++) (x :: xs) ys = x :: xs ++ ys
index : Fin n -> Vect n a -> a
index fZ (x :: xs) = x
index (fS k) (x :: xs) = index k xs
例:長さを型に持つリスト
Idris> the (Vect _ _) $ [1,2,3] ++ [4,5,6]
[1, 2, 3, 4, 5, 6] : Vect 6 Integer
Idris> Vect.index 5 $ [1,2,3] ++ [4,5,6]
6 : Integer
Idris> Vect.index 10 $ [1,2,3] ++ [4,5,6]
(input):1:15:When elaborating argument prf to
Prelude.Fin.fromInteger:
Can't unify
IsJust (Just x)
with
IsJust (integerToFin 10 (3 + 3))
DOM操作
• altJSの本懐、DOM操作
• iQuery
• https://github.com/idris-hackers/iQuery
• というのがあるのだが・・・
iQuery
• ものすごく機能が足りてない
• ラッパーが抽象型で生のJSオブジェクトにアク
セスできない
• → 使えない
完全に名前負け
というわけで
• 1から作るしかない
• ただのJavaScriptにコンパイルできる言語
• altJSとはなんだったのか・・・
• これだったらEmscriptenでC言語もaltJSなんでは
FFIでJavaScriptとやりとりする
• 任意のJavaScriptコードを埋め込める
• コードと引数は静的に検査される
alert : String -> IO ()
alert msg =
mkForeign (FFun "alert(%0)" [FString]
msg
%include
• JavaScriptのコードをincludeできる
(生成されるJSの先頭にくっつくだけ)
%include JavaScript "lib.js"
twice : (Int -> Int) -> Int -> IO Int
twice f x =
mkForeign (FFun "twice(%0,%1)"
[FFunction FInt FInt, FInt] FInt) f x
main : IO ()
main = alert (show !(twice (+1) 1)) -- 3
がでる
// lib.js
function twice(f, x) { return f(f(x)); }
適当なライブラリを作る
Document : Type
Document = Ptr
document : Document
document =
unsafePerformIO $ mkForeign (FFun "document" []
set : Ptr -> String -> String -> IO ()
set e mem val =
mkForeign (FFun "%0[%1]=%2" [FPtr, FString,
FString] FUnit)
e mem val
get : Ptr -> String -> IO String
get e mem =
mkForeign (FFun "%0[%1]" [FPtr, FString] FString) e
構文定義構文
• Idrisには構文を定義する構文がある!
• 例:ifの定義
boolCase : (x:Bool) -> Lazy a -> Lazy a -> a
boolCase True t e = t
boolCase False t e = e
syntax "if" [test] "then" [t] "else" [e] =
boolCase test t e
(´・_・`).oO(どういう仕組みなんだろう・・・)
使用例
syntax [object] "[" [member] "]" ":=" [value] =
set object member value
syntax [object] "[" [member] "]" =
get object member
main : IO ()
main = do
document["innerHTML"] := "(´・_・`)<つらぽよ"
TypeProvider
• F#のTypeProviderみたいなのもあるんですってよ!
デモ
• ライフゲーム
• まるばつゲーム(負けないことの証明付き)
デモ
• ライフゲーム
• まるばつゲーム(負けないことの証明付き)
Idrisのいけてないところ
• 添字アクセスO(1)の配列がない
• メモリバッファの型はあるみたいなので、それの上
に自作すれば良いのだろうか
• IORefがない
• とりあえずはJavaScriptのFFIで作れば良いか・・・
• なんだかものすごい本末転倒感
Idrisのいけてないところ
• 型検査が死ぬほど遅い
• コードの長さに対して指数的に増えていく
(ようにみえる)
• 正直コードを保存する度に苦痛なレベル
• コンパイルされたコードが遅い
• せっかく正格評価なのに、クソ遅い
• コード生成器の実装がクソ
• CのバックエンドでHaskellの10倍ぐらい遅い
• Unboxingとかインライニングとか特殊化とかたぶんこの
辺全く実装されていない
Idrisのいけてないところ
• 並行ライブラリが標準ライブラリにあるが、
JavaScriptのランタイムでは未サポート
_人人人人人人人人人人人_
> Not Yet Implemented
<
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄
Idrisのいけてないところ
• (僕は)証明が書けない
• 例えば、リストの要素アクセス
• Listは型に長さを含まない
• アクセス時は、添字が長さよりも小さいという証明を与
える必要がある・・・
Idris> :doc List.index
index : (n : Nat) -> (l : List a) -> (ok : lt n (length l) =
-> a
Find a particular element of a list.
Arguments:
ok : lt n (length l) = True -- a proof that the
within
bounds
beleave_me!!
Idris> :doc believe_me
believe_me : a -> b
Subvert the type checker. This function is abstract, so it
not reduce in the type checker. Use it with care - it can
in segfaults or worse!
Idris> :doc really_believe_me
really_believe_me : a -> b
Subvert the type checker. This function will reduce in th
checker. Use it with extreme care - it can result in
or worse!
まとめ
• IdrisでWebアプリを書くのは時期尚早
• 可能性は感じる
• 分野を開拓したい人にはおすすめ!
• デファクトのWebフレームワークを作れるか
も!?

Weitere ähnliche Inhalte

Was ist angesagt?

そんなトランザクションマネージャで大丈夫か?
そんなトランザクションマネージャで大丈夫か?そんなトランザクションマネージャで大丈夫か?
そんなトランザクションマネージャで大丈夫か?
takezoe
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
 

Was ist angesagt? (20)

ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
 
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけRDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
 
[AC05] マイクロサービスは分割がキモ!基幹システムのためのドメイン駆動設計
[AC05] マイクロサービスは分割がキモ!基幹システムのためのドメイン駆動設計[AC05] マイクロサービスは分割がキモ!基幹システムのためのドメイン駆動設計
[AC05] マイクロサービスは分割がキモ!基幹システムのためのドメイン駆動設計
 
TLS, HTTP/2演習
TLS, HTTP/2演習TLS, HTTP/2演習
TLS, HTTP/2演習
 
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
 
そんなトランザクションマネージャで大丈夫か?
そんなトランザクションマネージャで大丈夫か?そんなトランザクションマネージャで大丈夫か?
そんなトランザクションマネージャで大丈夫か?
 
私にとってのテスト
私にとってのテスト私にとってのテスト
私にとってのテスト
 
DockerコンテナでGitを使う
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使う
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
 
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり
 
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
 
モジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェースモジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェース
 
KafkaとAWS Kinesisの比較
KafkaとAWS Kinesisの比較KafkaとAWS Kinesisの比較
KafkaとAWS Kinesisの比較
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
Githubを使って簡単に helm repoを公開してみよう
Githubを使って簡単に helm repoを公開してみようGithubを使って簡単に helm repoを公開してみよう
Githubを使って簡単に helm repoを公開してみよう
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
Test Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるかTest Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるか
 
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!
 

Andere mochten auch

Andere mochten auch (8)

Haskell で LINE Bot を作ってみた
Haskell で LINE Bot を作ってみたHaskell で LINE Bot を作ってみた
Haskell で LINE Bot を作ってみた
 
「7つの言語、7つの世界」を読む
「7つの言語、7つの世界」を読む「7つの言語、7つの世界」を読む
「7つの言語、7つの世界」を読む
 
Haskell Lecture 1
Haskell Lecture 1Haskell Lecture 1
Haskell Lecture 1
 
型! 型!
型! 型!型! 型!
型! 型!
 
Haskell Backpack 事始め
Haskell Backpack 事始めHaskell Backpack 事始め
Haskell Backpack 事始め
 
Elm overview
Elm overviewElm overview
Elm overview
 
Elmで始めるFunctional Reactive Programming
Elmで始めるFunctional Reactive Programming Elmで始めるFunctional Reactive Programming
Elmで始めるFunctional Reactive Programming
 
ADVENTAR の Bot を作る with Haskell
ADVENTAR の Bot を作る with HaskellADVENTAR の Bot を作る with Haskell
ADVENTAR の Bot を作る with Haskell
 

Ähnlich wie IdrisでWebアプリを書く

第2回品川Redmine勉強会(日本語全文検索)
第2回品川Redmine勉強会(日本語全文検索)第2回品川Redmine勉強会(日本語全文検索)
第2回品川Redmine勉強会(日本語全文検索)
Masanori Machii
 
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義
JPCERT Coordination Center
 
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
linzhixing
 
知って得するC#
知って得するC#知って得するC#
知って得するC#
Shota Baba
 
入門機械学習1,2章
入門機械学習1,2章入門機械学習1,2章
入門機械学習1,2章
Kazufumi Ohkawa
 

Ähnlich wie IdrisでWebアプリを書く (20)

やや関数型を意識した風Elixir/Phoenixご紹介
やや関数型を意識した風Elixir/Phoenixご紹介やや関数型を意識した風Elixir/Phoenixご紹介
やや関数型を意識した風Elixir/Phoenixご紹介
 
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
 
第2回品川Redmine勉強会(日本語全文検索)
第2回品川Redmine勉強会(日本語全文検索)第2回品川Redmine勉強会(日本語全文検索)
第2回品川Redmine勉強会(日本語全文検索)
 
LastaFluteでKotlinをはじめよう
LastaFluteでKotlinをはじめようLastaFluteでKotlinをはじめよう
LastaFluteでKotlinをはじめよう
 
Cookpad Summer Intern 2015 - Programming Paradigm
Cookpad Summer Intern 2015 - Programming ParadigmCookpad Summer Intern 2015 - Programming Paradigm
Cookpad Summer Intern 2015 - Programming Paradigm
 
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
TerraformでECS+ECRする話
TerraformでECS+ECRする話TerraformでECS+ECRする話
TerraformでECS+ECRする話
 
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
 
DEV-011_TypeScript ~Any browser. Any host. Any OS. Open Source~
DEV-011_TypeScript ~Any browser. Any host. Any OS. Open Source~DEV-011_TypeScript ~Any browser. Any host. Any OS. Open Source~
DEV-011_TypeScript ~Any browser. Any host. Any OS. Open Source~
 
ATN No.2 Scala事始め
ATN No.2 Scala事始めATN No.2 Scala事始め
ATN No.2 Scala事始め
 
これからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツールこれからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツール
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
 
知って得するC#
知って得するC#知って得するC#
知って得するC#
 
Tech Fielders 2009/9/18 LT
Tech Fielders 2009/9/18 LTTech Fielders 2009/9/18 LT
Tech Fielders 2009/9/18 LT
 
J qmobiはjqueryから軽量化しているか
J qmobiはjqueryから軽量化しているかJ qmobiはjqueryから軽量化しているか
J qmobiはjqueryから軽量化しているか
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説
 
From Java To Clojure
From Java To ClojureFrom Java To Clojure
From Java To Clojure
 
textsearch_jaで全文検索
textsearch_jaで全文検索textsearch_jaで全文検索
textsearch_jaで全文検索
 
入門機械学習1,2章
入門機械学習1,2章入門機械学習1,2章
入門機械学習1,2章
 

Mehr von Hideyuki Tanaka (8)

ESPM2 2018 - Automatic Generation of High-Order Finite-Difference Code with T...
ESPM2 2018 - Automatic Generation of High-Order Finite-Difference Code with T...ESPM2 2018 - Automatic Generation of High-Order Finite-Difference Code with T...
ESPM2 2018 - Automatic Generation of High-Order Finite-Difference Code with T...
 
Xpath in-lens
Xpath in-lensXpath in-lens
Xpath in-lens
 
手書きスライド
手書きスライド手書きスライド
手書きスライド
 
Monad tutorial
Monad tutorialMonad tutorial
Monad tutorial
 
Yesod勉強会
Yesod勉強会Yesod勉強会
Yesod勉強会
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 
Icfp2009
Icfp2009Icfp2009
Icfp2009
 

IdrisでWebアプリを書く