haskell-ja > Archives > 2015/09/15

2015/09/15 03:31:41 UTCigrep
#
今すごいH本の読書会をしていて気づいたのですが、もしかして>>=の「=」って束縛の時に使う「x = "foo"」の「=」を象徴しているのでしょうか?
2015/09/15 03:34:51 UTCikegami__
#
象徴しているのかどうかはわかりませんが、(>>=)を発表などで発音する際には "bind" と呼ぶらしいです : (出典)https://wiki.haskell.org/Pronunciation
2015/09/15 03:42:53 UTCshiro
#
パイプに流し込むイメージを持っていました。HuttonのProgramming in Haskellで使われてる記号だと特に。
2015/09/15 03:57:41 UTCigrep
#
ああ、確かにどちらかと言うとパイプの方を聞きますよね。
#
> ikegamiさん そうそう、 (>>=) を口頭ではbindって言うのも思い出して思いました。
2015/09/15 04:51:03 UTCruicc
#
おそらく変数束縛そのままの意味ですよね、m >>= \x -> f x とすると、mの返り値がxを束縛するので
2015/09/15 04:57:45 UTC[1..100]>>=pen
#
近づいたので再掲。9月16日(水)「第2期 第21回 H本読書会 in 秋葉原」 #readhbon https://readhbon.doorkeeper.jp/events/31218
2015/09/15 05:02:09 UTCruicc
#
DSLを構成するのに、変数とその束縛に関してはホスト言語のものが使えるという嬉しさ?があるんですかね(bind)
#
EDSLはだいたいそんなもんか..
2015/09/15 05:10:44 UTCnobkz
#
僕も(>>=)を変数束縛のアナロジーだと考えてます。do記法における(<-)みたいなのも、かなり変数束縛に近いんじゃないかと思いますし、また、Haskell以外の言語で、Lispの「モナド」の実装とかではsetmとするとなるほど、読みやすい感じになるのを見ると。あと、どうでも良いですけど、ScalaのflatMapという命名は好きじゃないです。
2015/09/15 05:13:41 UTCigrep
#
setm, なるほど。set monadのm, か。
2015/09/15 05:18:58 UTCnobkz
#
#
すいません、typoです。(>>=)については、 flip (>>=) :: Monad m => (a -> m b) -> m a -> m bと、fmap :: Functor f => (a -> b) -> f a -> f b とすると、なるほど、ファンクターとモナド似てるなぁって感じになります。ここから、類推できるものはあるとは思います。
2015/09/15 05:28:04 UTCkazu
#
flip (>>=) には =<< という名前が付いてます。
#
> :type (=<<)
(=<<) :: Monad m => (a -> m b) -> m a -> m b
#
flatMap は、Haskell でいうところの concatMap のことです。リストの >>= は concatMap です。
#
古い教科書では flatMap が使われていることがあるので、flatMap の方が、由緒正しい名前かもしれません。
2015/09/15 05:35:21 UTCnobkz
#
ああ、そういえば、ありますね。=<<。
2015/09/15 05:43:57 UTCruicc
#
さっき圏論の歩き方5章で見ましたが、Kleisli Triple(T, η, (-)^#)の三つ目らしいです。圏論的にはなんか慣習名とか付いてないんですかね
#
(-)^# :: (a -> m b) -> (m a -> m b)
2015/09/15 06:19:56 UTCkazu
#
_^* は、Monad ではμで、すなわちjoinだったような。https://www.ipsj.or.jp/07editj/promenade/4703.pdf
#
_^# と _^* は記号が違うので、流儀が違うのかも。
2015/09/15 06:26:52 UTCruicc
#
Kleisli Tripleを(T, η, _^#), Monadを(T, η, μ), とした上でそれらは同じ概念である、と続いてますね。証明は一方から他方が構成できるというものです。なので記号が違うだけのようです。
2015/09/15 06:29:04 UTCkazu
#
しかし型が違いますよ。
#
join :: Monad m => m (m a) -> m a
2015/09/15 06:30:19 UTCruicc
#
(記号が違うだけ、というのは _^* と _^# の違いのことです)
2015/09/15 06:30:24 UTCkazu
#
join は、a -> m b を fmap した結果二重になった m を潰す役割があります。
2015/09/15 06:34:35 UTCnobkz
#
Kleisli Tripleと「Haskellのモナド」が、実際には対応していて、「圏論的なモナド」の別表現として、Kliesli Tripleが作れるってことかなと思いますが...
2015/09/15 06:43:39 UTChiratara
#
joinはη^*ですね。_^*ではなく。
2015/09/15 14:47:59 UTC[1..100]>>=pen
#
_^* は extension operator という見たいですね(私が見た論文では単に operator と書いてありました)。 https://en.wikipedia.org/wiki/Kleisli_category#Extension_operators_and_Kleisli_triples