Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
入門SRTP - 型レベルプログラミングちょっとだけ入門
Search
0918nobita
May 22, 2021
Technology
470
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
入門SRTP - 型レベルプログラミングちょっとだけ入門
0918nobita
May 22, 2021
More Decks by 0918nobita
See All by 0918nobita
入門言語としての F#
0918nobita
0
470
プログラミング"言語"をはじめよう
0918nobita
0
64
RxJSで始めるリアクティブ・プログラミング と GitHub Emoji
0918nobita
1
100
Firebaseを使って作るPWA (LINE Developer Meetup #43)
0918nobita
1
830
OSSとライセンスの話
0918nobita
0
120
Other Decks in Technology
See All in Technology
AI時代の「技術的負債」の変質ー概念の終焉と再解釈、エージェントと共に向かう先
nwiizo
0
680
事業課題から技術的負債に向き合う
sansantech
PRO
1
340
あるけみー式LTスライド作成術
alchemy1115
1
200
Sigmaユーザーのための有用リソース一挙公開 & Sigmaで使えるMCP #sigma_ucj /useful-resources-for-sigma-computing-users-and-mcps-with-sigma
shinyaa31
0
200
研究開発部の紹介 / Sansan R&D Profile
sansan33
PRO
5
25k
2026/09/10 Spring Bootから Jakarta EE/MicroProfileへの移行
megascus
0
350
OpenTelemetry eBPF Instrumentationの舞台裏 / Behind the Scenes of OpenTelemetry eBPF Instrumentation
ymotongpoo
4
1.2k
日経電子版を支えていく Kasane Design System/fec_fukuoka
nikkei_engineer_recruiting
0
1.1k
家のリアーキテクト・リファクタリング
suguruooki
0
130
クロスボーダーM&AのValue Upを支えるプロダクト開発。日米チームのハブになったプロダクトエンジニアの実践 / Product Engineering Conference 2026
genda
0
120
AI時代、データエンジニアが一番おもろい
genshun9
0
290
ASTを使って影響範囲を特定する
nealle
0
180
Featured
See All Featured
Design in an AI World
tapps
1
310
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
430
A better future with KSS
kneath
240
18k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
480
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.4k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
270
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
980
4 Signs Your Business is Dying
shpigford
187
23k
Abbi's Birthday
coloredviolet
3
9.9k
Building a Scalable Design System with Sketch
lauravandoore
464
34k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.2k
Bash Introduction
62gerente
615
220k
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
ご清聴ありがとうございました!