圏論
写像
https://www.youtube.com/watch?v=8ycVEcgH4bI
https://www.youtube.com/watch?v=IpvhsTpsULk&t=348s
https://www.youtube.com/watch?v=HPG6v4xGrN8&t=358s
配列モナド
関手T : 型構築子T + 持ち上げT
型構築子T: T(A) = A[]
型構築子TはA型を受け取り、A型の配列を返す
持ち上げT: (A -> B) -> (A[] -> B[])
適用例:(T(f))([a1,a2,a3]) = [f(a1),f(a2),f(a3)]
持ち上げTは、関数f: A -> B を受け取り、それを配列の各要素に適応した関数を返す
関数(射)を受け取って、関数(射)を返す。つまり射から射への対応付けなので、Tは圏論における関手である。
構築η:ηA(a) = ([a])
型Aを受け取り、「A型の値を受け取って、それを配列に入れたものを返す」
適用例:
ηInt : Int -> Int[]
ηBool : Bool -> Bool[]
型(対象)を受け取って、関数(射)を対応付ける
つまり、ηは自然変換
平坦化μ
μA: A[][] -> A[]
μA([[a1,a2],[a3,a4]]]) = [a1,a2,a3,a4]
配列の配列を受け取り、それをフラット化して返す
型(対象)を受け取って、関数(射)を対応付ける
つまり、μは自然変換
モナドの活用
上記の配列モナドを使うことで、『値・型・関数』を関係性を保ったまま"配列化"することができる
例:)
以下のピュアな要素があるとする
型:Bool、値:true
型:Int、値:12
関数f:bool -> int
値trueを構築ηによって、true一個だけを含む配列に変換できる true -> [true] 、
型構築子Tによって、bool型bool配列型に変換できる bool -> bool[]
boolからintへの関数fは、持ち上げTによって、 bool[] -> int[] 型の関数にできる
配列化された後の要素は、元の関係性を保っている
もとの関係性を保ったまま、新しく「配列」という構造を追加している