モナドの説明のほとんどは、モナドが値をラップする例を使用しています。たとえばMaybe a
、a
型変数はラップされたものです。しかし、何もラップしないモナドについて疑問に思っています。
人為的な例として、制御できるがセンサーを持たない現実世界のロボットがあるとします。多分私はそれを次のように制御したいと思います:
robotMovementScript :: RobotMonad ()
robotMovementScript = do
moveLeft 10
moveForward 25
rotate 180
main :: IO ()
main =
liftIO $ runRobot robotMovementScript connectToRobot
架空の API では、connectToRobot
何らかの種類のハンドルを物理デバイスに返します。この接続が の「コンテキスト」になりRobotMonad
ます。ロボットへの接続は値を返すことができないため、モナドの具象型は常にRobotMonad ()
です。
いくつかの質問:
- 私の不自然な例は正しいように見えますか?
- モナドの「コンテキスト」の概念を正しく理解していますか? ロボットの接続をコンテキストとして説明するのは正しいですか?
RobotMonad
-- 値を決してラップしない-- のような -- モナドを持つことは理にかなっていますか? それともモナドの基本概念に反するのでしょうか?- モノイドはこの種のアプリケーションにより適していますか? ロボット制御アクションを と連結することを想像でき
<>
ます。表記do
の方が読みやすいようですが。 - モナドの定義では、型が常にであることを保証する何かがあるでしょうか/あるでしょう
RobotMonad ()
か?
Data.Binary.Put
例として見てきた。それは私が考えているものと似ているように見えます(またはおそらく同一ですか?)。しかし、それには Writer モナドと Builder モノイドも含まれます。これらの追加されたしわと私の現在のスキルレベルを考慮すると、Put
モナドは最も有益な例ではないかもしれません.
編集
このようなロボットや API を実際に構築する必要はありません。この例は完全にわざとです。モナドから値を引き出す理由が決してない例が必要でした。ですから、ロボットの問題を解決する最も簡単な方法を求めているわけではありません。むしろ、内部値のないモナドに関するこの思考実験は、モナド全般をよりよく理解するための試みです。