Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
入門SRTP - 型レベルプログラミングちょっとだけ入門
Search
0918nobita
May 22, 2021
Technology
0
330
入門SRTP - 型レベルプログラミングちょっとだけ入門
0918nobita
May 22, 2021
Tweet
Share
More Decks by 0918nobita
See All by 0918nobita
入門言語としての F#
0918nobita
0
370
プログラミング"言語"をはじめよう
0918nobita
0
47
RxJSで始めるリアクティブ・プログラミング と GitHub Emoji
0918nobita
1
82
Firebaseを使って作るPWA (LINE Developer Meetup #43)
0918nobita
1
770
OSSとライセンスの話
0918nobita
0
87
Other Decks in Technology
See All in Technology
web-application-security
matsuihidetoshi
0
170
VS CodeでAWSを操作しよう
smt7174
8
1.7k
Kernel MemoryでAzure OpenAI Serviceとお手軽データソース連携
mitsuzono
1
260
どうするコスト最適化のトレードオフ
tetsuyaooooo
1
530
リテール金融(キャッシュレス・ネット銀行・ネット証券)の競争環境と経済圏
8maki
0
1.3k
開発生産性大幅アップ!Postman VS Code拡張機能
nagix
2
390
非同期推論システムによるコスト削減と信頼性向上
koki_nishihara
0
260
AOAI をきっかけに 社内の Azure 管理を見直した話
recruitengineers
PRO
1
300
オーナーシップを持つ領域を明確にする
konifar
13
3.2k
Google Cloud Next '24でブログを10本書いた方法と勉強会を沸かせた方法
yasumuusan
0
310
Google Cloud の AI を支える裏側のインフラを垣間見る!
maroon1st
0
360
LayerXにおけるLLMプロダクト開発の今までとこれから
layerx
PRO
1
390
Featured
See All Featured
The Power of CSS Pseudo Elements
geoffreycrofte
60
5k
For a Future-Friendly Web
brad_frost
172
9k
Six Lessons from altMBA
skipperchong
21
3k
Build your cross-platform service in a week with App Engine
jlugia
225
17k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
357
22k
Designing with Data
zakiwarfel
96
4.8k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
116
18k
A Modern Web Designer's Workflow
chriscoyier
689
190k
The Cult of Friendly URLs
andyhume
74
5.7k
Build The Right Thing And Hit Your Dates
maggiecrowley
24
2k
How GitHub Uses GitHub to Build GitHub
holman
468
290k
Why You Should Never Use an ORM
jnunemaker
PRO
51
8.6k
Transcript
入門SRTP 型レベルプログラミングちょっとだけ入門 第1回 Fun Fan Fsharp LT資料
|> 自己紹介 松本 幸大 (まつもと こうだい) 2000年2月16日生まれ (現在21歳) 放送大学教養学部 在学中
Twitter : @0918nobita GitHub : 0918nobita 好きなプログラミング言語 : F#, OCaml, Haskell, Lisp, Rust 一番使うプログラミング言語 : TypeScript (Webフロントエンド案件)
|> 自己紹介 趣味:プログラミング言語探求, PCゲーム(Apex Legends), 音楽ゲーム (CHUNITHM, Arcaea), 作曲(DTM), イラスト制作…etc.
オリジナル曲「Tonari’s Diary」 (SoundCloud) イラスト「最期に果たす決意」 (pixiv)
|> 2種類の型パラメータ • ジェネリック型パラメータ • 静的に解決される型パラメータ (SRTP: Statically Resolved Type
Parameters)
|> 2種類の型パラメータ • ジェネリック型パラメータ • 静的に解決される型パラメータ (SRTP: Statically Resolved Type
Parameters)
|> 2種類の型パラメータ [ジェネリック型パラメータ] (他の .NET 言語と共通)
|> 2種類の型パラメータ [ジェネリック型パラメータ] 異なる型の値を渡して呼び出せるが、生成される関数定義は1通りだけ → サンプルプログラムをコンパイルして得られたアセンブリ (.dll) を見てみる
ジェネリックな静的メソッドが1つだけ
|> 2種類の型パラメータ • ジェネリック型パラメータ • 静的に解決される型パラメータ (SRTP)
|> 2種類の型パラメータ [静的に解決される型パラメータ (SRTP)] F# 独自の言語機能で、コンパイル時に当てはめられる (解決される) 型が決まる
|> SRTP の「制約」 inline 関数・静的メソッドにおいて、引数が持っているべきメンバ関数とその型を 指定し、コンパイラに静的チェックさせられる (制約を推論してくれることもある)
|> SRTP の「メンバ呼び出し」 SRTP に対して、静的メンバを指定して呼び出せる 制約とは異なり、関数本体 (= 以降) で使用する ^X
は GetName : unit -> string を 静的メンバとして持っていなければならない メンバ制約
|> SRTP の「メンバ呼び出し」 SRTP に対して、静的メンバを指定して呼び出せる 制約とは異なり、関数本体 (= 以降) で使用する メンバ呼び出し
^X の持つ GetName 静的メソッドを、 第1引数に () を渡して呼び出す
None
|> SRTP の制約で推論型を取り出す SRTP の制約のなかで、引数では使っていない SRTP を新たに用いることもできる → そこに当てはまる (推論される)
型を取り出せる
|> SRTP の制約で推論型を取り出す メンバ制約 引数では直接使っていない SRTP
|> SRTP の制約で推論型を取り出す ^AorB の持つ GetName 静的メソッドを、 第1引数に () を渡して呼び出す
メンバ呼び出し
変化なし
|> F# での型レベルプログラミングの特異性 最終的な静的型の情報を実行時に持ってこれる (+ リフレクションで操作できる) → 型計算の結果によって実行時の挙動を変えられる TypeScript に代表されるような、実行時に静的型の情報が「消える」言語だと
このようなテクニックは通常使えない
|> 型レベル線形リストを定義する 取り出し・結合・反転などの操作に対して、 より厳格な型付けの行われる線形リストを定義してみる 値 型 Nil Nil Cons (T,
Nil) Cons<T, Nil> Cons (T, Cons (U, Nil)) Cons<T, Cons<U, Nil>>
|> 型レベル線形リストを定義する ここからは実際のソースコードを GitHub 上で確認したり、 ライブコーディングしながら話します 0918nobita/fs-typelevel https://git.io/Jsy8g
|> まとめ • SRTPはコンパイル時に決まる型パラメータ • メンバ制約を指定して、引数に渡せる値を制限できる • 推論型をパターンマッチ的に取り出せる • オーバーロードしてコンパイラに選択してもらえる
• 再帰的に型を計算させることも可能 • 最終的な型は実行時に持ち込んで活用できる
Next… 型レベルプログラミングで定義された型を楽に生成したい → F# より高レベルな言語でリテラルを記述して、F# の型に翻訳したい → TypeProvider が使えるかもしれない!? (現在調査中)
|> 参考文献 • Statically Resolved Type Parameters - F# |
Microsoft Docs • SRTP入門 by midoliy - Zenn • F# で型レベルプログラミング - SevenColoured
ご清聴ありがとうございました!