動的型付け言語には多くのモナドの実装があります:
一般に、チャーチ・チューリング・テーゼは、ある言語でできることはすべて他の言語でもできると言っています。
上記の例の選択からおそらくわかるように、私は (ほとんど) Ruby プログラマーです。そこで、冗談として、上記の例の 1 つを取り上げて、私がまったく知らない言語で再実装しました。この言語は通常、あまり強力ではないと考えられており、唯一のプログラミング言語のようです。モナドのチュートリアルを見つけることができなかった惑星で。あなたに紹介してもいいですか... PHPの恒等モナド:
<?php
class Identity {
protected $val;
public function __construct($val) { $this->val = $val; }
public static function m_return($a) { return new Identity($a); }
public static function m_bind($id_a, $f) { return $f($id_a->val); }
}
var_dump(Identity::m_bind(
Identity::m_return(1), function ($x) {
return Identity::m_return($x+1);
}
));
?>
静的型、ジェネリック、クロージャーは必要ありません。
実際にモナドを静的にチェックしたい場合は、静的型システムが必要です。しかし、それは多かれ少なかれトートロジーです。型を静的にチェックしたい場合は、静的型チェッカーが必要です。当たり前。
あなたの質問に関して:
私の理解では、モナドを実装する言語は静的に型チェックする必要があります。そうしないと、コンパイル中に型エラーを見つけることができず、「複雑さ」が制御されません。私の理解は正しいですか?
あなたは正しいですが、これはモナドとは何の関係もありません。これは、一般的な静的型チェックに関するものであり、配列、リスト、または単純な退屈な整数にも同様に適用されます。
ここにも厄介な問題があります。たとえば、C#、Java、または C でのモナドの実装を見ると、上記の PHP の例よりもはるかに長く、はるかに複雑です。特に、どこもかしこも種類が豊富なので見ごたえ十分です。しかし、醜い真実は次のとおりです。C#、Java、および C の型システムは、実際には の型を表現するほど強力ではありませんMonad
。特に、Monad
はランク 2 のポリモーフィック型ですが、C# と Java はランク 1 のポリモーフィズム ("ジェネリック" と呼んでいますが、同じことです) のみをサポートし、C はそれさえサポートしていません。
そのため、モナドは実際には C#、Java、および C で静的に型チェックされていません(これが、たとえば、LINQ モナド内包表記が型ではなくパターンとして定義されている理由です。C# では型を表現できないためです。 ) 静的型システムが行うことはすべて、実装をより複雑にすることであり、実際には役に立ちません。モナドの実際の型安全性を得るには、Haskell のようなより洗練された型システムが必要です。
注: @Porgesが指摘しているように、上で書いたことはジェネリック型自体にのみ適用されます。やのような特定のモナドmonad
の型を確かに表現できますが、それ自体の型を表現することはできません。これは、「 IS-A 」という事実を型チェックできないこと、および のすべてのインスタンスで機能する一般的な操作を型チェックできないことを意味します。List
Maybe
Monad
List
Monad
Monad
(モナドの型に準拠するだけでなくMonad
、モナドの法則にも準拠していることを確認することは、Haskell の型システムにとってもおそらく多すぎることに注意してください。おそらく、依存型と、そのための本格的な自動定理証明器が必要になるでしょう。)