2014年12月26日

関数はファンクタであるよ、まとめ!

関数は関手であるよっ!!
1
‏velengel @dora_maruta

@aiya_000 Readerモナドってなんですか?

2014-12-26 21:18:46
Deprecatad @aiya_000

@dora_maruta ではなく、 (->)型のこと。 (->)、つまりアローは型と型を結ぶ。 Int -> Float とするとIntとFloatを結ぶ。 この時上記の型は前置表記で (->) Int Float とも書ける。 それで、…それで……なんだっけ……。

2014-12-26 21:24:23
有声咽頭摩擦音 @dskszk

@aiya_000 @dora_maruta 問題1. ((->) r)が関手になることを示せ. 問題2. その関手がモナドになることを示せ.

2014-12-26 21:26:53
‏velengel @dora_maruta

@dskszk @aiya_000 そうその((->) r)っていうのがよくわかってない感じです。 関手ってなんですか。。

2014-12-26 21:29:11
Deprecatad @aiya_000

ぬー、((->) r)がファンクタであることを…ふむ。

2014-12-26 21:31:59
Deprecatad @aiya_000

((->) r)は関数の集合であって、関数の型である。 関手であることの必要条件はえーと… fmap id xがid . fmap xであって xであることと fmap (f . g)がfmap f . fmap gであること…。

2014-12-26 21:37:45
Deprecatad @aiya_000

@dora_maruta つまり関数がFunctorであることを示せばいいはずなのだけど…うー。

2014-12-26 21:38:49
有声咽頭摩擦音 @dskszk

@dora_maruta @aiya_000 関手ってのはFunctorの和訳で, fmap = (.)とするとFunctorになるじゃろ. というかなるんじゃ.

2014-12-26 21:44:41
有声咽頭摩擦音 @dskszk

@dora_maruta @aiya_000 fmap :: (a -> b) -> f a -> f bだから, f a = (r -> a)のときは, fmap :: (a -> b) -> (r -> a) -> r -> bになるので, fmap f g = f . g

2014-12-26 21:49:51
‏velengel @dora_maruta

@dskszk @aiya_000 fmap :: (a -> b) -> f a -> f bだから, f a = Maybe aのときは, fmap :: (a -> b) -> Maybe a -> Maybe bになる(?)

2014-12-26 21:54:13
有声咽頭摩擦音 @dskszk

@dora_maruta @aiya_000 「なる」というか「そうなる関数が定義できればFunctorだね」と言える.(もう1つ条件があってfmap (f . g) == fmap f . fmap gを満たさないといけない) そうすると, MaybeもFunctorといえる.

2014-12-26 21:58:38
Deprecatad @aiya_000

@dskszk @dora_maruta あっ!! 関数と関数を受け取る関手 fmap :: (a -> b) -> ((->) r) a -> ((->) r) b で

2014-12-26 22:11:09
Deprecatad @aiya_000

@dskszk @dora_maruta (a -> b) -> (r -> a) -> (r -> b) だから… (.) :: (a -> b) -> (c -> a) -> (c -> b) で

2014-12-26 22:11:22
Deprecatad @aiya_000

@dskszk @dora_maruta (a -> b) と (c -> a) を繋いで (c -> b) だから っ!!! 関数がファンクタだっ!!

2014-12-26 22:11:28
Deprecatad @aiya_000

僕はいつもfmapは (a -> b)と (f a -> f b) が対応していると考えていたけど関数ファンクタは (a -> b) -> (r -> a)が (r -> b)を返すことで (.)と対応しているんだっ!れ

2014-12-26 22:16:26
Deprecatad @aiya_000

関数ファンクタって今まで全然わかんなかったんだけど理由がわかったっ!!

2014-12-26 22:16:30
‏velengel @dora_maruta

@dskszk @aiya_000 もうひとつの条件の方の、fとgの型は、 (.) :: (a -> b) -> (c -> a) -> (c -> b)  だからそれぞれ (a -> b) と (c -> a) ですか?

2014-12-26 22:19:14
Deprecatad @aiya_000

@dskszk @dora_maruta わーっ!! なるほどですーっ!! すごいこれっ!!

2014-12-26 22:21:47
Deprecatad @aiya_000

@dskszk @dora_maruta fmap ((+) 10 . (+) 20) = (\x -> Just (10 + x )) . (\y -> Just (20 + y)) であるからMaybeはFunctorである。 と言っていいんでしょうか。

2014-12-26 22:20:41
有声咽頭摩擦音 @dskszk

@aiya_000 @dora_maruta 具体例としてはその通りです. (+10),(+20)から任意の関数f, gにしても, Maybeの場合は成り立ちそうですね. 実のところ, Haskellの代数データ型はうまくfmapを選べば全て関手になります. 証明は読者に(ry

2014-12-26 22:27:44
Deprecatad @aiya_000

@dskszk @dora_maruta 全て関手!? すごい、でも確かにfmapを任意のものに選べば関手に…なるんだ……。

2014-12-26 22:36:12
‏velengel @dora_maruta

おおお。すげー 頭の中でつながってきた。。

2014-12-26 22:21:59
残りを読む(2)

コメント

コメントがまだありません。感想を最初に伝えてみませんか?