さて、私はHaskellプログラマーではありませんが、Haskellの背後にある多くのアイデアに絶対に興味を持っており、それを学ぶことを検討しています。しかし、私は正方で立ち往生しています。かなり基本的なように見えるモナドに頭を包むことができないようです。私は、モナドを説明するように求めるSOに関する100万の質問があることを知っているので、私を悩ませているものについてもう少し具体的に説明します。
この素晴らしい記事(Javascriptの紹介)を読んで、モナドを完全に理解したと思いました。それから私はモナドのウィキペディアのエントリを読んで、これを見ました:
ポリモーフィック型(M t)→(t→M u)→(M u)の結合演算。これは、Haskellが中置演算子>>=で表します。その最初の引数はモナディック型の値であり、その2番目の引数は最初の引数の基になる型から別のモナディック型にマップする関数であり、その結果は他のモナディック型になります。
さて、私が引用した記事では、bindは引数を1つだけ取る関数でした。ウィキペディアは2つ言っています。モナドについて私が理解したと思ったのは次のとおりです。
- モナドの目的は、さまざまな入力タイプと出力タイプを持つ関数を取得し、それを構成可能にすることです。これは、入力型と出力型を単一のモナディック型でラップすることによって行われます。
- モナドは、バインドとユニットという2つの相互に関連する関数で構成されています。Bindは、構成不可能な関数fを受け取り、入力としてモナディック型を受け入れ、モナディック型を返す新しい関数gを返します。gは構成可能です。unit関数は、fが期待する型の引数を取り、それをモナディック型でラップします。次に、これをgに渡すか、gのような関数の任意の合成に渡すことができます。
しかし、バインドの概念には関数という1つの引数が必要なので、何か問題があるはずです。しかし(ウィキペディアによると)Haskellのバインドは実際には2つの引数を取ります!私の間違いはどこにありますか?