IO [[Char]]
とIO()
をバインドすることは可能ですが、Maybe
をIO
でバインドすることはできません。誰かがこのリラクゼーションがいかに悪いデザインにつながるかの例を挙げることはできますか?モナド自体ではなく、多形型のモナドの自由が許可されるのはなぜですか?同じMonad型だけを `>> '演算子で連結できるようにする背景にある論理は何ですか?
答えて
「これはなにがMonad
なのか」などの理論的な理由がたくさんあります。しかし、ここから少し離れて実装の詳細を見てみましょう。
最初にオフ - Monad
は魔法ではありません。それは単なる標準型クラスです。 Monad
のインスタンスは、誰かが書き込むときにのみ作成されます。
このインスタンスの記述は、(>>)
の動作を定義するものです。通常は(>>=)
のデフォルト定義で暗黙的に行われていますが、それはちょうど(>>=)
がより一般的な演算子であるという証拠であり、それを書くには(>>)
と同じ決定をする必要があります。
より一般的な種類の演算子が異なる場合は、2つの質問に答える必要があります。まず、タイプは何ですか?第二に、実装を提供するにはどうしたらいいですか?あなたの質問から、希望するタイプが何であるかは、本当に明確ではありません。次のうちの1つです:
class Poly1 m n where
(>>) :: m a -> n b -> m b
class Poly2 m n where
(>>) :: m a -> n b -> n b
class Poly3 m n o | m n -> o where
(>>) :: m a -> n b -> o b
これらのすべてを実装することができます。しかし、それらを実際に使用するためには、2つの本当に重要な要素を失います。
- 一緒に使用する予定のタイプのペアごとにインスタンスを作成する必要があります。これは、各タイプの単なるインスタンスよりもはるかに複雑な作業です。何か約
n
対n^2
。 - 予測可能性が失われます。操作は何であるかはですか?ここで理論と実践が交差するところです。
Monad
の背後にある理論は、操作に多くの制限を設けています。これらの制限は「モナド法」と呼ばれています。それらはHaskellで検証する能力を超えていますが、それに従わないMonad
インスタンスはバグであるとみなされます。最終的には、Monad
の操作には直ちに直感を立てることができます。関係するすべてのタイプの詳細を調べることなく、それらを使用することができます。従属するプロパティーを知っているからです。私が提案したクラスはどれも、そのような保証はありません。あなたは彼らが何をしているのか分かりません。
私は私が正しくあなたの質問を理解していることを確認しないんだけど、それはあなたが[]
とIO
を構成することができることと同じ意味でIO
か[]
とMaybe
を構成するために間違いなく可能です。あなたが:t
を使用してGHCiの中の種類を確認した場合、
getContents >>= return . lines
はあなたにIO [String]
を与える
。あなたは
>>= return . map Text.Read.readMaybe
を追加する場合はIO
、[]
とMaybe
の組成物であるIO [Maybe a]
の種類を取得します。
>>= return . Data.Maybe.catMaybes
に渡してIO [a]
にフラット化することができます。次に、解析された有効な入力行のリストを、それを再度平坦化して出力を計算する関数に渡すかもしれません。
1
2
Ignore this!
3
印刷6
:入力と、一緒にプログラム
import Text.Read (readMaybe)
import Data.Maybe (catMaybes)
main :: IO()
main = getContents >>= -- IO String
return . lines >>= -- IO [String]
return . map readMaybe >>= -- IO [Maybe Int]
return . catMaybes >>= -- IO [Int]
return . (sum :: [Int] -> Int) >>= -- IO Int
print -- IO()
このパット
。
またIO (Maybe [String])
、Maybe [IO String]
で作業することが可能であろう、など
あなたにも>>
でこれを行うことができます。考えられる例:getContents >> (return . Just) False
は入力を読み込み、無視してIO (Maybe Bool)
を返します。
- 1. KMPパターンマッチングアルゴリズムの背景にある理論は何ですか?
- 2. ()=>演算子とは何ですか?
- 3. Javascriptで>>> =演算子とは何ですか?
- 4. 定義ブール論理演算子(V、^、XOR、 - >、<->は)
- 5. 論理演算子をCで結合する
- 6. オブジェクトメソッドにアクセスするときに "< >"演算子とは何ですか?
- 7. NOR論理演算子とは何ですか?
- 8. 論理積演算子、加重ヒストグラム(excel)の名前付き範囲にある論理演算子
- 9. これがどのように機能しているかの背景にある論理は何ですか?
- 10. ハスケル(>>)演算子
- 11. どのような種類の論理演算子ですか?
- 12. Haskellのバインド演算子(>> =)
- 13. C++で ' - >'演算子をどのようにオーバーロードするのですか?
- 14. 演算子 '=>'はC#でどういう意味ですか?
- 15. 論理演算子||
- 16. ||演算子は=演算子と同じですか?
- 17. JavaとJavaScriptの演算子>>>の違いは何ですか?
- 18. 論理演算子は
- 19. マルチセレクションでphp論理演算子を使用する方法
- 20. C#のプロパティで "=>"演算子の意味は何ですか?
- 21. C++での " - >"演算子の意味は何ですか?
- 22. このJavaScript演算子の意味は何ですか? >>>
- 23. C++で新しい演算子と削除演算子の背後にある論理を理解してください
- 24. スウィフト論理演算子
- 25. 演算子>>を継承できますか?
- 26. フィルタと論理演算子
- 27. PythonのAndAlso(&&)とOrElse(||)論理演算子に相当するものは何ですか?論理演算のための.NET VBとC#で
- 28. このプログラムの背後にある論理は何ですか?
- 29. Cで - >演算子は何をしますか?
- 30. Perlで - >演算子は何をしますか?
typeclassインスタンスが実際にサポートする操作しか使用できません。 'Monad'のインスタンスは'(>> =):: m a - >(a - > m b) - > m b'のみを供給します。つまり、全体的に同じ 'm 'を使用する必要があります。任意の "何にも縛られない"操作があるという賢明な意味がある場合は、それをタイプキャストとして指定し、あなたが知っている限り多くのインスタンスを作成することができます。 '(>> =):: m a - >(a - > n b) - > n b'のようなクラスは、コンシューマーの何も必要としないが、実装者にとっては分かりやすく満足することはほとんど不可能である。 –
'Monad'型クラスの背後にある理論は、' m'が同じ関数子であることを要求します。このプロパティはIOを処理するための基礎として適しています。別のタイプに切り替えることで 'IO'から脱出することはできません。 – chepner
あなたは 'たぶん'に 'IO'をバインドするのですか? 'IO'モナドは状態を変更しません。状態を変更する方法を記述します。 –