これは、一部は本物の好奇心であり、一部は私の理解のチェックです。私はおそらくポイントを逃している。
Haskellで、モナドがreturn
またはunit
と呼ばれる操作を使用して、型をコンテナに入れること、つまりモナド空間に型を上げることを記述するのはなぜですか?操作lift
を呼び出す方が直感的です。
現在、自分のプロジェクトへのモナドの(おそらく正しくない)ポートで、私は(疑似コード)を使用しています:
MyThing .lift(x).bind(f)...
のではなく
MyThing .nit(x).bind(f)...
私がxをモナド空間に持ち上げることを考えると、より直感的になるからです。
それは間違った方向ですか?私は抽象的に十分に考えないことでやけどをし続けます、そして私はそれが再び事実であると思います。
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
。
Benjamin Hodgsonが彼のコメントで述べたように、用語liftは通常、非モナド関数をモナドに持ち上げるのに適用されます。
関数が具体的にreturn
と呼ばれる理由については、これはdo
構文糖で使用されているためです。これは、通常使用される命令型C/ALGOLスタイルコードブロックに似ていることを意味します値を返すreturn
キーワード。
同様に、bind
は.NETではSelectMany
と呼ばれます。これは、itsモナド内包表記がSQLクエリに似ているためです。