web-dev-qa-db-ja.com

モナドはなぜ「リフト」ではなく「リターン」または「ユニット」を使用するのですか?

これは、一部は本物の好奇心であり、一部は私の理解のチェックです。私はおそらくポイントを逃している。

Haskellで、モナドがreturnまたはunitと呼ばれる操作を使用して、型をコンテナに入れること、つまりモナド空間に型を上げることを記述するのはなぜですか?操作liftを呼び出す方が直感的です。

現在、自分のプロジェクトへのモナドの(おそらく正しくない)ポートで、私は(疑似コード)を使用しています:

MyThing .lift(x).bind(f)...

のではなく

MyThing .nit(x).bind(f)...

私がxをモナド空間に持ち上げることを考えると、より直感的になるからです。

それは間違った方向ですか?私は抽象的に十分に考えないことでやけどをし続けます、そして私はそれが再び事実であると思います。

3
Rob

unitという用語は、モナドを2つの自然変換_unit : Identity ~> m_および_join : m x m ~> m_として定義するカテゴリ理論に由来します。気になる場合は、_bind f = join . fmap f_。

returnは、returnが適切にALGOLっぽく見える場所の表記法に由来します。これがreturnが単純な古い関数ではなく、ある種の制御フローであると示唆する傾向があるため、これが適切な名前であったかどうかは実際に議論の余地があります。

私たちは通常liftをファンクターのようなもののために予約し、関数全体またはモナドを持ち上げます。 _lift :: m a -> t m a_およびliftM :: (a -> b) -> m a -> m b

10
Daniel Gratzer

Benjamin Hodgsonが彼のコメントで述べたように、用語liftは通常、非モナド関数をモナドに持ち上げるのに適用されます。

関数が具体的にreturnと呼ばれる理由については、これはdo構文糖で使用されているためです。これは、通常使用される命令型C/ALGOLスタイルコードブ​​ロックに似ていることを意味します値を返すreturnキーワード。

同様に、bindは.NETではSelectManyと呼ばれます。これは、itsモナド内包表記がSQLクエリに似ているためです。

6
Jörg W Mittag