また、PHPのモナドについて





この資料を金曜日の夕方のだらだらとした涼しい夜に読んだ後、私はまだ不満と以下のどこかに燃えている特定の感覚を持っています。 私は狂人の熱心に座って、これがなぜ起こっているのかを言う人がいることを期待してコメントを更新し、私は一人ではないことを理解します。 しかし... ...悲しいかな、これは起こりませんでした。 その後、私はこの創造物を訪れ、同じ気持ちを感じ、何かを変える必要があることに気付きました。



デブリーフィング


特定のモナド、つまりオプションの値にすべてのonりを注ぎます。

しかし、最初に、Monadルートクラスコードを見てください。



public static function unit($value) { if ($value instanceof static) { return $value; } return new static($value); }
      
      







そしてすぐに私たちは恐怖に陥ります-あなたはモナドにモナドを置くことはできません!



すべての機能でこの不正をすばやく排除します。



 //     public static function unit($value) { return new static($value); }
      
      







どういうわけか、コードはすぐにさらに美しくなりました(なぜif'y O_oが必要なのか)。



しかし、モナドにモナドを含めることができるようになったため、これらの状況に対応するために関数を処理する必要があります。 実際:



 //   abstract public function fbind($function, array $args = array()); //     abstract public function flatten();
      
      







それでは、Maybeモナドに移りましょう。



NULL 'Iの権利の侵害と同じ値です。 そして、なぜ著者は私が添付できない心の追加の特定の機能でそれを満たさなかったのですか:



 abstract class Maybe extends Monad { abstract public function extractOrElse($val, array $args = array()); }
      
      







ご想像のとおり、このメソッドは内部値または渡された値を返します。

しかし、なぜ$ args ? お願いします。 はい、一般的に、この値が必要な場合にのみ計算する必要がある関数を渡さないでください。 (名前による呼び出しの欠乏!)



したがって、クラスJustおよびNothingについて説明します。



 class Just extends Maybe { public function extractOrElse($val, array $args = array()) { return $this->value; } public function fbind($function, array $args = array()) { $res = $this->runCallback($function, $this->value, $args) if(res instanceof Maybe) return $res; else throw new \InvalidArgumentException('Returned value must be an instanceof Maybe monad'); } public function flatten() { if($this->value instanceof Maybe) return $this->value; else throw new Exception('Value of just is not an instance of Maybe monad'); } }
      
      





 class Nothing extends Maybe { protected static $_instance = NULL; final private function __construct() { } final private function __clone() { } final public static function getInstance(){ if(null !== static::$_instance){ return static::$_instance; } static::$_instance = new static(); return static::$_instance; } public function extractOrElse($val, array $args = array()) { if (is_callable($val) || $val instanceof Closure) return call_user_func_array($val, $args); else return $val } public function bind($function, array $args = array()) { return $this; } public function fbind($function, array $args = array()) { return $this; } public function flatten() { throw new Exception("Nothing flatten call"); } }
      
      







読者が気づいたかもしれませんが、これはシングルトンです。 まあ、本当に、なぜ私たちは多くの「何も」が必要なのですか?





前の記事と同様の例を調べてみましょう。

親の親の名前を取得する必要があります。



その記事の例を次に示します。



 function getGrandParentName($item) { $monad = new Maybe($item); $getParent = function($item) { //   null,     ! return $item->getParent(); }; $getName = function($item) { return $item->getName(); } return $monad ->bind($getParent) ->bind($getParent) ->bind($getName) ->extract(); }
      
      







モナドはすでに関数の入力に行くべきだと思います。状況が存在しない可能性があるかもしれません。 そしてもちろん、要素には親がない場合があります。親は、実際にはgetParent値の型を示唆しています。 そして、それは判明しました:



 function getGrandParentName($item) { $getParent = function($item) { return $item->getParent(); }; $getName = function($item) { return $item->getName(); } return $item ->fbind($getParent) ->fbind($getParent) ->bind($getName) ->extractOrElse("default"); }
      
      







そして今、取得中にNothingに遭遇した場合、 デフォルトが返され、そうでなければ名前が返されます



さて、私の魂はPHPのモナドに関して少し落ち着いています。 まあ、または少なくとも比較的多分 ...



これと前の記事について意見を聞きたいです。 また、 「ライブラリ」についても、そこに何を追加しますか。それは単なる私の意見であり、多くの目標があります。



PS本当に最初の1枚の紙に石を投げてはいけません。

TheRavenのよりクリーンなイメージに感謝します :)



All Articles