Scala 初心者が Hom 函手を Scala で考えてみた

Scala 初心者が Hom 函手を Scala で考えてみた
Pre-ScalaMatsuri 2020
高瀬 和之
@Guvalif
>=> 自己紹介
- 名前: 高瀬 和之 (たかせ かずゆき)
- 所属: Chatwork 株式会社 @大阪
- 専門:
- フロントエンド開発
(React / Redux / TypeScript)
- ティーチング
(アルゴリズム / 機械学習 / 数学
/ 組み込みシステム)
- ひとこと:
- Scala のイベントは初めてです 💪
2
>=> アジェンダ
1. ことの発端
2. そもそも函手とは?
3. Hom 函手
4. Scala での実装例
3
01ことの発端
>=> ある日のひとまく
Scala ガチ勢の H 氏 < Haskell 書けるらしいじゃん? Scala もいけるっしょ 💪
たかせ < えっ?
~ 数週間後 ~
- 私に送られてきたのは…
- State Monad ゴリゴリで,
- for 式をいい感じに駆使していて,
- Files changed が 18 くらいある,
- そんな Pull-Request 😇🎉
5
>=> とはいえ…
- 意外とがんばれば読める
- for 式 ⇒ Haskell の do 構文
- Monad ⇒ Haskell の屋台骨
- case class ⇒ Haskell の Record っぽさ
- trait ⇒ Haskell の型クラスっぽさ
- etc...
かくして、”Do Haskell for Scala” という標語が、生まれたとかなんとか…
(※フロントエンド開発メンバーとの日常会話にて)
6
>=> 問題点 🙅‍♂
- なんとなく読める ≠ 使いこなせる
- Scala の言語仕様をきちんと理解した上で、モナモナできるようになりたい!
というわけで…
1. まずはファンクタファンクタできるように、型クラス周りの仕様を知る
2. 何か適当な Functor を実装してみる
こうして私は Scala に入門しました 🚪
7
02そもそも函手とは?
~ 圏論への招待 ~
>=> 圏論ことはじめ (1):対象と射
- 圏論の材料
- 対象 ⇒ 点
- 射 ⇒ 点から点を結ぶ矢印 (点と点の関連性を表す)
- ここまでの事実 ⇒ なんか有向グラフっぽい
9
>=> 圏論ことはじめ (2):圏の例
- しりとりの圏 (対象:ひらがな,射:単語)
10
- 型と関数の圏 (対象:型,射:関数)
り ご ら ぱ り
りんご ごりら らっぱ ぱせり
String Int
Boolean
length
isEven
isCamelCase
>=> 圏論ことはじめ (3):函手 / Functor
- ある圏から、グラフ構造を全て抜き出す
- 別の圏にて、グラフ構造が一致する箇所に対応づける
- 対象と対象の対応関係,および射と射の対応関係,その2つ組と考えてもよい
(※実際には公理を満たすように,かつ実用的に必要な性質を盛り込んで考えます)
11
圏 D圏 C
03Hom 函手
>=> Hom 函手ことはじめ (1):Hom 集合
- 圏論では、ある対象 ● から別の対象 ● へ、複数の射が存在してもよい
- すなわち、射の集合を考えることができる ⇒ Hom 集合と呼ぶ
- 対象 ● から対象 ● に関する Hom 集合 ⇒ Hom(●, ●) と表す
- 下図の場合:
- Hom(●, ●) = { a, b, c, d, e }
- Hom(●, ●) = ∅
13
a
e
d
b
c
>=> Hom 函手ことはじめ (2):舞台を集合の圏へ
- 圏 C で何か1つ対象を固定する (今回は X)
- 固定した対象と、圏 C の任意の対象に関して、Hom 集合を取る
14
X
A
D C
B
圏 C 集合の圏
Hom(X, A)
Hom(X, B)
Hom(X, C)
※Hom(X, D) は空集合
>=> Hom 函手ことはじめ (3):Hom 集合の間に射が存在する条件
- 対象 X から対象 A への任意の射 a
- 対象 X から対象 B へのある射 b
- これらに対して、b = f ∘ a を満たす射 f が存在すること
(※ b を使って X から B へ向かうことと、a と f を使って X から B へ向かうことが等しくなる,の意)
15
X
B
A
圏 C 集合の圏
Hom(X, A)
Hom(X, B)
∀a
∃b
∃f, b = f ∘ a
f ∘ _
>=> Hom 函手ことはじめ (4):共変 Hom 函手
- 共変 Hom 函手とは:
- 任意の圏から集合の圏への函手であって,
- 対象 * を対象 Hom(X, *) へ移し,
- (制約を満たす) 射 f を射 f ∘ _ へ移す,そんな函手
16
X
B
A
圏 C 集合の圏
Hom(X, A)
Hom(X, B)
∀a
∃b
∃f, b = f ∘ a
f ∘ _
04Scala での実装例
>=> 共変 Hom 函手 in Scala
- 型と関数の圏をベースに、Scala 圏を考えると:
- * → Hom(X, *) なる対象の対応は、カインド X => * として表現できる
(※厳密には、指数対象というものを考えて、Hom 集合を Scala 圏に埋め込むとそうなります)
- f → f ∘ _ なる射の対応は、高階関数 f => f compose _ として表現できる
18
X
B
A
Scala 圏 Scala 圏
X => A
X => B
∀a
∃b
∃f, b = f compose a
f compose _
>=> 実際にやってみた
// F[_] が対象の対応関係を,map が射の対応関係を表す
trait EndoFunctor[F[_]] {
def map[A, B](f: A => B): F[A] => F[B]
}
type X = Unit // 固定する型は何でも良いが、今回は Unit 型
type Xto[Y] = X => Y // Hom 函手における、対象の対応関係
implicit val homFunctor = new EndoFunctor[Xto] {
def map[A, B](f: A => B): Xto[A] => Xto[B] = // Hom 函手における、射の対応関係
f compose _
}
// 任意の函手の実装を用いて、射を相手先の圏へ移す(※といいつつ Scala 圏には閉じてるので、Endo = 自己)
def map[F[_], A, B](f: A => B)(implicit functor: EndoFunctor[F]): F[A] => F[B] =
functor.map(f)
19
>=> 実際につかってみた
val f: Int => String = x => s"String($x)" // Int と String を結ぶ射をピックアップ
val Fa: Xto[Int] = x => 0 // Hom(X, Int) から、要素をピックアップ
// 1. Hom(X, Int) の要素 Fa
// 2. Hom 集合を結ぶ射 map(f)
// これらから、Hom(X, String) の要素 Fb を導出
val Fb: Xto[String] = map(f).apply(Fa)
println(Fb(())) // String(0) と表示される
20
- 実装してみての感想:
- 高階カインドは、やはりあると表現力が高い 🎉
- implicit parameter は、auto capturing default parameter だと思った 🤔
- 本当は map(f).apply(Fa) の部分を、map(f)(Fa) と書けたらかっちょよい
ちなみに…
Chatwork では、社内勉強会で圏論なんかも取り扱っているらしいですよ 👍
1 de 21

Recomendados

Scala 初心者が米田の補題を Scala で考えてみた por
Scala 初心者が米田の補題を Scala で考えてみたScala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみたKazuyuki TAKASE
5.7K vistas64 diapositivas
Introduction to Categorical Programming (Revised) por
Introduction to Categorical Programming (Revised)Introduction to Categorical Programming (Revised)
Introduction to Categorical Programming (Revised)Masahiro Sakai
6.4K vistas53 diapositivas
計算可能実数とは por
計算可能実数とは計算可能実数とは
計算可能実数とはYoshihiro Mizoguchi
4K vistas15 diapositivas
圏論のモナドとHaskellのモナド por
圏論のモナドとHaskellのモナド圏論のモナドとHaskellのモナド
圏論のモナドとHaskellのモナドYoshihiro Mizoguchi
10.6K vistas24 diapositivas
オブジェクト指向できていますか? por
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?Moriharu Ohzu
237.5K vistas129 diapositivas
クロージャデザインパターン por
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターンMoriharu Ohzu
19.6K vistas146 diapositivas

Más contenido relacionado

La actualidad más candente

ホモトピー型理論入門 por
ホモトピー型理論入門ホモトピー型理論入門
ホモトピー型理論入門k h
5.7K vistas16 diapositivas
NumPyが物足りない人へのCython入門 por
NumPyが物足りない人へのCython入門NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門Shiqiao Du
36.9K vistas71 diapositivas
証明プログラミング超入門 por
証明プログラミング超入門証明プログラミング超入門
証明プログラミング超入門Kyoko Kadowaki
10.9K vistas21 diapositivas
すごいHaskell 第7章 型や型クラスを自分で作ろう(前編) por
すごいHaskell 第7章 型や型クラスを自分で作ろう(前編)すごいHaskell 第7章 型や型クラスを自分で作ろう(前編)
すごいHaskell 第7章 型や型クラスを自分で作ろう(前編)Nozomu Kaneko
4.6K vistas17 diapositivas
C++ マルチスレッド 入門 por
C++ マルチスレッド 入門C++ マルチスレッド 入門
C++ マルチスレッド 入門京大 マイコンクラブ
57.8K vistas53 diapositivas
LLVM最適化のこつ por
LLVM最適化のこつLLVM最適化のこつ
LLVM最適化のこつMITSUNARI Shigeo
7.4K vistas27 diapositivas

La actualidad más candente(20)

ホモトピー型理論入門 por k h
ホモトピー型理論入門ホモトピー型理論入門
ホモトピー型理論入門
k h5.7K vistas
NumPyが物足りない人へのCython入門 por Shiqiao Du
NumPyが物足りない人へのCython入門NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門
Shiqiao Du36.9K vistas
証明プログラミング超入門 por Kyoko Kadowaki
証明プログラミング超入門証明プログラミング超入門
証明プログラミング超入門
Kyoko Kadowaki10.9K vistas
すごいHaskell 第7章 型や型クラスを自分で作ろう(前編) por Nozomu Kaneko
すごいHaskell 第7章 型や型クラスを自分で作ろう(前編)すごいHaskell 第7章 型や型クラスを自分で作ろう(前編)
すごいHaskell 第7章 型や型クラスを自分で作ろう(前編)
Nozomu Kaneko4.6K vistas
今から始める Lens/Prism por Naoki Aoyama
今から始める Lens/Prism今から始める Lens/Prism
今から始める Lens/Prism
Naoki Aoyama8.5K vistas
Sphinxでまとめる多言語環境APIドキュメント por Iosif Takakura
Sphinxでまとめる多言語環境APIドキュメントSphinxでまとめる多言語環境APIドキュメント
Sphinxでまとめる多言語環境APIドキュメント
Iosif Takakura3.6K vistas
私を SKI に連れてって por Susisu
私を SKI に連れてって私を SKI に連れてって
私を SKI に連れてって
Susisu 2.2K vistas
Haskell Day2012 - 参照透過性とは何だったのか por Kousuke Ruichi
Haskell Day2012 - 参照透過性とは何だったのかHaskell Day2012 - 参照透過性とは何だったのか
Haskell Day2012 - 参照透過性とは何だったのか
Kousuke Ruichi15K vistas
関数型プログラミングのデザインパターンひとめぐり por Kazuyuki TAKASE
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり
Kazuyuki TAKASE3K vistas
ものまね鳥を愛でる 結合子論理と計算 por Hiromi Ishii
ものまね鳥を愛でる 結合子論理と計算ものまね鳥を愛でる 結合子論理と計算
ものまね鳥を愛でる 結合子論理と計算
Hiromi Ishii3.8K vistas
C++ マルチスレッドプログラミング por Kohsuke Yuasa
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
Kohsuke Yuasa107.7K vistas
数学プログラムを Haskell で書くべき 6 の理由 por Hiromi Ishii
数学プログラムを Haskell で書くべき 6 の理由数学プログラムを Haskell で書くべき 6 の理由
数学プログラムを Haskell で書くべき 6 の理由
Hiromi Ishii32.8K vistas
各言語の k-means 比較 por y-uti
各言語の k-means 比較各言語の k-means 比較
各言語の k-means 比較
y-uti6.9K vistas
Interactive Music II SuperCollider入門 4 - 楽器を定義、変調合成(RM, AM, FM) por Atsushi Tadokoro
Interactive Music II SuperCollider入門 4 -  楽器を定義、変調合成(RM, AM, FM)Interactive Music II SuperCollider入門 4 -  楽器を定義、変調合成(RM, AM, FM)
Interactive Music II SuperCollider入門 4 - 楽器を定義、変調合成(RM, AM, FM)
Atsushi Tadokoro4.6K vistas

Similar a Scala 初心者が Hom 函手を Scala で考えてみた

How wonderful to be (statically) typed 〜型が付くってスバラシイ〜 por
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜Hiromi Ishii
3.7K vistas72 diapositivas
Asakusa FrameworkとScalaの密かな関係 por
Asakusa FrameworkとScalaの密かな関係Asakusa FrameworkとScalaの密かな関係
Asakusa FrameworkとScalaの密かな関係hishidama
2.2K vistas53 diapositivas
Introduction to Spray at Kansai Functional Programming por
Introduction to Spray at Kansai Functional ProgrammingIntroduction to Spray at Kansai Functional Programming
Introduction to Spray at Kansai Functional ProgrammingSuguru Hamazaki
1.8K vistas44 diapositivas
Scala.jsはじめました? por
Scala.jsはじめました?Scala.jsはじめました?
Scala.jsはじめました?K Kinzal
1.8K vistas53 diapositivas
Scalaプログラミング・マニアックス por
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックスTomoharu ASAMI
6.5K vistas44 diapositivas
Gaucheでマクロを書こう por
Gaucheでマクロを書こうGaucheでマクロを書こう
Gaucheでマクロを書こうHideaki Nagamine
6K vistas80 diapositivas

Similar a Scala 初心者が Hom 函手を Scala で考えてみた(11)

How wonderful to be (statically) typed 〜型が付くってスバラシイ〜 por Hiromi Ishii
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
Hiromi Ishii3.7K vistas
Asakusa FrameworkとScalaの密かな関係 por hishidama
Asakusa FrameworkとScalaの密かな関係Asakusa FrameworkとScalaの密かな関係
Asakusa FrameworkとScalaの密かな関係
hishidama2.2K vistas
Introduction to Spray at Kansai Functional Programming por Suguru Hamazaki
Introduction to Spray at Kansai Functional ProgrammingIntroduction to Spray at Kansai Functional Programming
Introduction to Spray at Kansai Functional Programming
Suguru Hamazaki1.8K vistas
Scala.jsはじめました? por K Kinzal
Scala.jsはじめました?Scala.jsはじめました?
Scala.jsはじめました?
K Kinzal1.8K vistas
Scalaプログラミング・マニアックス por Tomoharu ASAMI
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックス
Tomoharu ASAMI6.5K vistas
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8 por y_taka_23
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
y_taka_2321.2K vistas
オブジェクト指向開発におけるObject-Functional Programming por Tomoharu ASAMI
オブジェクト指向開発におけるObject-Functional Programmingオブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programming
Tomoharu ASAMI6.2K vistas
ScalaプログラマのためのHaskell入門 por Yasuaki Takebe
ScalaプログラマのためのHaskell入門ScalaプログラマのためのHaskell入門
ScalaプログラマのためのHaskell入門
Yasuaki Takebe6.6K vistas
並列対決 Elixir × Go × C# x Scala , Node.js por Yoshiiro Ueno
並列対決 Elixir × Go × C# x Scala , Node.js並列対決 Elixir × Go × C# x Scala , Node.js
並列対決 Elixir × Go × C# x Scala , Node.js
Yoshiiro Ueno3.9K vistas

Último

onewedge_companyguide1 por
onewedge_companyguide1onewedge_companyguide1
onewedge_companyguide1ONEWEDGE1
66 vistas22 diapositivas
概要.pdf por
概要.pdf概要.pdf
概要.pdfTaira Shimizu
6 vistas1 diapositiva
ウォーターフォール開発で生 産性を測る指標 por
ウォーターフォール開発で生 産性を測る指標ウォーターフォール開発で生 産性を測る指標
ウォーターフォール開発で生 産性を測る指標Kouhei Aoyagi
55 vistas13 diapositivas
SSH超入門 por
SSH超入門SSH超入門
SSH超入門Toru Miyahara
490 vistas21 diapositivas
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私 por
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私修治 松浦
208 vistas36 diapositivas
Najah Matsuo Self Introduction por
Najah Matsuo Self IntroductionNajah Matsuo Self Introduction
Najah Matsuo Self IntroductionNajahMatsuo
10 vistas29 diapositivas

Último(7)

onewedge_companyguide1 por ONEWEDGE1
onewedge_companyguide1onewedge_companyguide1
onewedge_companyguide1
ONEWEDGE166 vistas
ウォーターフォール開発で生 産性を測る指標 por Kouhei Aoyagi
ウォーターフォール開発で生 産性を測る指標ウォーターフォール開発で生 産性を測る指標
ウォーターフォール開発で生 産性を測る指標
Kouhei Aoyagi55 vistas
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私 por 修治 松浦
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私
修治 松浦208 vistas
Najah Matsuo Self Introduction por NajahMatsuo
Najah Matsuo Self IntroductionNajah Matsuo Self Introduction
Najah Matsuo Self Introduction
NajahMatsuo10 vistas

Scala 初心者が Hom 函手を Scala で考えてみた

  • 1. Scala 初心者が Hom 函手を Scala で考えてみた Pre-ScalaMatsuri 2020 高瀬 和之 @Guvalif
  • 2. >=> 自己紹介 - 名前: 高瀬 和之 (たかせ かずゆき) - 所属: Chatwork 株式会社 @大阪 - 専門: - フロントエンド開発 (React / Redux / TypeScript) - ティーチング (アルゴリズム / 機械学習 / 数学 / 組み込みシステム) - ひとこと: - Scala のイベントは初めてです 💪 2
  • 3. >=> アジェンダ 1. ことの発端 2. そもそも函手とは? 3. Hom 函手 4. Scala での実装例 3
  • 5. >=> ある日のひとまく Scala ガチ勢の H 氏 < Haskell 書けるらしいじゃん? Scala もいけるっしょ 💪 たかせ < えっ? ~ 数週間後 ~ - 私に送られてきたのは… - State Monad ゴリゴリで, - for 式をいい感じに駆使していて, - Files changed が 18 くらいある, - そんな Pull-Request 😇🎉 5
  • 6. >=> とはいえ… - 意外とがんばれば読める - for 式 ⇒ Haskell の do 構文 - Monad ⇒ Haskell の屋台骨 - case class ⇒ Haskell の Record っぽさ - trait ⇒ Haskell の型クラスっぽさ - etc... かくして、”Do Haskell for Scala” という標語が、生まれたとかなんとか… (※フロントエンド開発メンバーとの日常会話にて) 6
  • 7. >=> 問題点 🙅‍♂ - なんとなく読める ≠ 使いこなせる - Scala の言語仕様をきちんと理解した上で、モナモナできるようになりたい! というわけで… 1. まずはファンクタファンクタできるように、型クラス周りの仕様を知る 2. 何か適当な Functor を実装してみる こうして私は Scala に入門しました 🚪 7
  • 9. >=> 圏論ことはじめ (1):対象と射 - 圏論の材料 - 対象 ⇒ 点 - 射 ⇒ 点から点を結ぶ矢印 (点と点の関連性を表す) - ここまでの事実 ⇒ なんか有向グラフっぽい 9
  • 10. >=> 圏論ことはじめ (2):圏の例 - しりとりの圏 (対象:ひらがな,射:単語) 10 - 型と関数の圏 (対象:型,射:関数) り ご ら ぱ り りんご ごりら らっぱ ぱせり String Int Boolean length isEven isCamelCase
  • 11. >=> 圏論ことはじめ (3):函手 / Functor - ある圏から、グラフ構造を全て抜き出す - 別の圏にて、グラフ構造が一致する箇所に対応づける - 対象と対象の対応関係,および射と射の対応関係,その2つ組と考えてもよい (※実際には公理を満たすように,かつ実用的に必要な性質を盛り込んで考えます) 11 圏 D圏 C
  • 13. >=> Hom 函手ことはじめ (1):Hom 集合 - 圏論では、ある対象 ● から別の対象 ● へ、複数の射が存在してもよい - すなわち、射の集合を考えることができる ⇒ Hom 集合と呼ぶ - 対象 ● から対象 ● に関する Hom 集合 ⇒ Hom(●, ●) と表す - 下図の場合: - Hom(●, ●) = { a, b, c, d, e } - Hom(●, ●) = ∅ 13 a e d b c
  • 14. >=> Hom 函手ことはじめ (2):舞台を集合の圏へ - 圏 C で何か1つ対象を固定する (今回は X) - 固定した対象と、圏 C の任意の対象に関して、Hom 集合を取る 14 X A D C B 圏 C 集合の圏 Hom(X, A) Hom(X, B) Hom(X, C) ※Hom(X, D) は空集合
  • 15. >=> Hom 函手ことはじめ (3):Hom 集合の間に射が存在する条件 - 対象 X から対象 A への任意の射 a - 対象 X から対象 B へのある射 b - これらに対して、b = f ∘ a を満たす射 f が存在すること (※ b を使って X から B へ向かうことと、a と f を使って X から B へ向かうことが等しくなる,の意) 15 X B A 圏 C 集合の圏 Hom(X, A) Hom(X, B) ∀a ∃b ∃f, b = f ∘ a f ∘ _
  • 16. >=> Hom 函手ことはじめ (4):共変 Hom 函手 - 共変 Hom 函手とは: - 任意の圏から集合の圏への函手であって, - 対象 * を対象 Hom(X, *) へ移し, - (制約を満たす) 射 f を射 f ∘ _ へ移す,そんな函手 16 X B A 圏 C 集合の圏 Hom(X, A) Hom(X, B) ∀a ∃b ∃f, b = f ∘ a f ∘ _
  • 18. >=> 共変 Hom 函手 in Scala - 型と関数の圏をベースに、Scala 圏を考えると: - * → Hom(X, *) なる対象の対応は、カインド X => * として表現できる (※厳密には、指数対象というものを考えて、Hom 集合を Scala 圏に埋め込むとそうなります) - f → f ∘ _ なる射の対応は、高階関数 f => f compose _ として表現できる 18 X B A Scala 圏 Scala 圏 X => A X => B ∀a ∃b ∃f, b = f compose a f compose _
  • 19. >=> 実際にやってみた // F[_] が対象の対応関係を,map が射の対応関係を表す trait EndoFunctor[F[_]] { def map[A, B](f: A => B): F[A] => F[B] } type X = Unit // 固定する型は何でも良いが、今回は Unit 型 type Xto[Y] = X => Y // Hom 函手における、対象の対応関係 implicit val homFunctor = new EndoFunctor[Xto] { def map[A, B](f: A => B): Xto[A] => Xto[B] = // Hom 函手における、射の対応関係 f compose _ } // 任意の函手の実装を用いて、射を相手先の圏へ移す(※といいつつ Scala 圏には閉じてるので、Endo = 自己) def map[F[_], A, B](f: A => B)(implicit functor: EndoFunctor[F]): F[A] => F[B] = functor.map(f) 19
  • 20. >=> 実際につかってみた val f: Int => String = x => s"String($x)" // Int と String を結ぶ射をピックアップ val Fa: Xto[Int] = x => 0 // Hom(X, Int) から、要素をピックアップ // 1. Hom(X, Int) の要素 Fa // 2. Hom 集合を結ぶ射 map(f) // これらから、Hom(X, String) の要素 Fb を導出 val Fb: Xto[String] = map(f).apply(Fa) println(Fb(())) // String(0) と表示される 20 - 実装してみての感想: - 高階カインドは、やはりあると表現力が高い 🎉 - implicit parameter は、auto capturing default parameter だと思った 🤔 - 本当は map(f).apply(Fa) の部分を、map(f)(Fa) と書けたらかっちょよい