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
430
入門SRTP - 型レベルプログラミングちょっとだけ入門
0918nobita
May 22, 2021
Tweet
Share
More Decks by 0918nobita
See All by 0918nobita
入門言語としての F#
0918nobita
0
460
プログラミング"言語"をはじめよう
0918nobita
0
56
RxJSで始めるリアクティブ・プログラミング と GitHub Emoji
0918nobita
1
100
Firebaseを使って作るPWA (LINE Developer Meetup #43)
0918nobita
1
810
OSSとライセンスの話
0918nobita
0
120
Other Decks in Technology
See All in Technology
OCI技術資料 : コンピュート・サービス 概要
ocise
4
54k
AIエージェント、 社内展開の前に知っておきたいこと
oracle4engineer
PRO
2
150
TypeScript 7.0の現在地と備え方
uhyo
7
1.3k
楽しく学ぼう!ネットワーク入門
shotashiratori
4
3.4k
僕、S3 シンプルって名前だけど全然シンプルじゃありません よろしくお願いします
yama3133
1
220
Cortex Code CLI と一緒に進めるAgentic Data Engineering
__allllllllez__
0
400
Tebiki Engineering Team Deck
tebiki
0
27k
Scrumは歪む — 組織設計の原理原則
dashi
0
200
最強のAIエージェントを諦めたら品質が上がった話 / how quality improved after giving up on the strongest AI agent
kt2mikan
0
190
CyberAgentの生成AI戦略 〜変わるものと変わらないもの〜
katayan
0
250
Lambda Web AdapterでLambdaをWEBフレームワーク利用する
sahou909
0
150
Zeal of the Convert: Taming Shai-Hulud with AI
ramimac
0
130
Featured
See All Featured
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.1k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
It's Worth the Effort
3n
188
29k
Discover your Explorer Soul
emna__ayadi
2
1.1k
How to Talk to Developers About Accessibility
jct
2
150
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Designing for humans not robots
tammielis
254
26k
Code Review Best Practice
trishagee
74
20k
How to Think Like a Performance Engineer
csswizardry
28
2.5k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
980
Deep Space Network (abreviated)
tonyrice
0
92
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.9k
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
ご清聴ありがとうございました!