17

私は関数型プログラミングスタイルを学んでいます。Don't Fear the Monadsで、Brian BeckmanはMonad について素晴らしい紹介をしました。彼は、Monad は複雑さに対処するための関数の合成に関するものであると述べました。

Monad には、unit型 T を増幅された型 M(T) に転送する関数が含まれています。T から M(U) への関数を指定すると、型 M(T) を別の型 M(U) に変換する Bind 関数。(U は T である可能性がありますが、必ずしもそうとは限りません)。

私の理解では、モナドを実装する言語は静的に型チェックする必要があります。そうしないと、コンパイル中に型エラーを見つけることができず、「複雑さ」が制御されません。私の理解は正しいですか?

4

4 に答える 4

27

動的型付け言語には多くのモナドの実装があります:

一般に、チャーチ・チューリング・テーゼは、ある言語でできることはすべて他の言語でもできると言っています。

上記の例の選択からおそらくわかるように、私は (ほとんど) 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 」という事実を型チェックできないこと、および のすべてのインスタンスで機能する一般的な操作を型チェックできないことを意味します。ListMaybeMonadListMonadMonad

(モナドの型に準拠するだけでなくMonad、モナドの法則にも準拠していることを確認することは、Haskell の型システムにとってもおそらく多すぎることに注意してください。おそらく、依存型と、そのための本格的な自動定理証明器が必要になるでしょう。)

于 2008-12-27T12:31:55.023 に答える
0

あなたの質問のタイトルが尋ねるように、モナドを実装する言語が静的に型付けされなければならないということは確かにありません。あなたが概説した理由から、それは良い考えかもしれませんが、コンパイル時にエラーが検出されなかったために誰も停止したことはありません. PHP を書いている人の数を見てください。

于 2008-12-27T06:01:55.997 に答える
0

State モナドのクロージャーが必要です。調べたところ、PHPには5.3以降のクロージャーがあります。そうすれば、もう問題にはなりません。

于 2010-05-15T02:43:06.933 に答える
-3

いいえ、php ではモナドを実装することはできません。そのためには閉鎖が必要です。とはいえ、クラスでパターン マッチングをシミュレートする場合、Maybe の概念は依然として有用です。

abstract class Maybe {
        abstract public function isJust();
        public function isNothing(){
                return !$this->isJust();
        }
}

class Just extends Maybe {
        protected $val = null;
        public function __construct($val){
                $this->val = $val;

        }
        public function isJust(){
                return true;
        }
        public function getVal(){
                return $this->val;
        }

}
class Nothing extends Maybe {
        protected $val = null;
        public function __construct(){

        }
        public function isJust(){
                return false;
        }
}

function just(){
        print "isJust";
}
function nothing(){
        print "nothing";
}
function MaybeFunc(Maybe $arg){
        if(get_class($arg) == 'Just'){
                print "Just";
        } else {
                print "Nothing";
        }
}

MaybeFunc(new Just(5));
MaybeFunc(new Nothing());
于 2010-05-11T13:47:38.380 に答える