Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
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
54
RxJSで始めるリアクティブ・プログラミング と GitHub Emoji
0918nobita
1
99
Firebaseを使って作るPWA (LINE Developer Meetup #43)
0918nobita
1
810
OSSとライセンスの話
0918nobita
0
120
Other Decks in Technology
See All in Technology
初めてのDatabricks AI/BI Genie
taka_aki
0
200
S3を正しく理解するための内部構造の読解
nrinetcom
PRO
2
120
5分で知るMicrosoft Ignite
taiponrock
PRO
0
390
ガバメントクラウド利用システムのライフサイクルについて
techniczna
0
190
Kiro Autonomous AgentとKiro Powers の紹介 / kiro-autonomous-agent-and-powers
tomoki10
0
530
打 造 A I 驅 動 的 G i t H u b ⾃ 動 化 ⼯ 作 流 程
appleboy
0
350
re:Inventで気になったサービスを10分でいけるところまでお話しします
yama3133
1
120
ログ管理の新たな可能性?CloudWatchの新機能をご紹介
ikumi_ono
1
840
多様なデジタルアイデンティティを攻撃からどうやって守るのか / 20251212
ayokura
0
470
re:Invent 2025 ふりかえり 生成AI版
takaakikakei
1
210
regrowth_tokyo_2025_securityagent
hiashisan
0
250
AWSを使う上で最低限知っておきたいセキュリティ研修を社内で実施した話 ~みんなでやるセキュリティ~
maimyyym
2
1.7k
Featured
See All Featured
[SF Ruby Conf 2025] Rails X
palkan
0
540
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.8k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
710
Balancing Empowerment & Direction
lara
5
800
GraphQLの誤解/rethinking-graphql
sonatard
73
11k
Bash Introduction
62gerente
615
210k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Six Lessons from altMBA
skipperchong
29
4.1k
Optimizing for Happiness
mojombo
379
70k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
8.3k
Why Our Code Smells
bkeepers
PRO
340
57k
How STYLIGHT went responsive
nonsquared
100
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
ご清聴ありがとうございました!