MonadはIOとdo記法のためにあると説明した方がわかりやすくね?
@koyama41 個人的には、型クラスは結局何かある性質を持った型すべてに対して抽象化された関数を使いたい/書きたいときにつかうものと捉えているので、だからdo記法を使えるもの全体としてのモナドがある……という理解ですね。
2012-11-27 23:45:22そもそもC++に疎いので演算子多重定義が糖衣構文なのを知らなかった。Haskellの+がIntでもDoubleでも使えるとかいう話とはまた別なのな。
2012-11-27 23:54:16C++はHaskellみたいに演算子を自前で定義できません. RT @xenophobia__: そもそもC++に疎いので演算子多重定義が糖衣構文なのを知らなかった。Haskellの+がIntでもDoubleでも使えるとかいう話とはまた別なのな。
2012-11-27 23:56:51Haskell において (+) は言語組み込みでも何でもない演算子の一つだけど, C++ における + は言語組み込みの演算子です.
2012-11-27 23:57:27C++ における + と Haskell における do は,言語組み込みの機能であるという点で共通しています. 別に C++ の + 演算子が糖衣構文だと言ってるわけではないです(元々の意味があるので). ただし + 演算子を特別扱いせず関数にすることは可能です.
2012-11-27 23:59:30ただ,言語の機能を可能な限り削ろうとすれば, + 演算子を標準ライブラリの関数として実装することも可能ですが,それは面倒なので + 演算子は演算子として楽に表記できるようになってます. そういう意味では糖衣構文と言えなくも無いです.
2012-11-28 00:00:57Haskell は言語組み込みで Monad を(正確には (>=) や (>>) や fail を)特別扱いしている.
2012-11-28 00:04:05そういう例は他の言語にはたくさんあるけど,こと Haskell でそれをやってる,っていうのは,まぁ特別だと思うのが自然だろう. なにしろ Haskell さんは (+) とかの演算子すら言語組み込みじゃないし. (ただし - 演算子は特別扱い)
2012-11-28 00:06:04Haskell で (-) を特別扱いするのは式を自然に書くためで, Monad を特別扱いするのは命令を自然に書くためですにゃ.
2012-11-28 00:08:07@koie 単純に Haskell 唯一の単項演算子であり,単項演算子はユーザ定義できないって時点で特別扱いですね. それに加えて二項演算子でもあるのでセクションに使えない( (- a) が \x -> x - a ではなく negate a と解釈される)のも特殊です.
2012-11-28 00:14:14@koie 特別扱いしないのであれば, -a という表記は止めて, not みたいに negate a みたいに書かせる筈なのです.
2012-11-28 00:14:50なんかList Comprehension(リスト内包表記)の話が出なかったな……。あれはListがMonadのインスタンスになってて嬉しいことの一つなんだけど
2012-11-28 12:12:52