문제

기능적 프로그래밍 스타일을 배우고 있습니다. ~ 안에 모나드를 두려워하지 마십시오, Brian Beckman은 Monad에 대해 훌륭한 소개를했습니다. 그는 모나드가 복잡성을 다루기 위해 기능의 구성에 관한 것이라고 언급했다.

모나드에는 a unit 유형 t를 증폭 된 유형 m (t)로 전달하는 함수; 및 t에서 m (u)까지의 함수가 주어지면 유형 m (t)를 다른 유형 m (u)로 변환하는 결합 함수. (u는 t 일 수 있지만 반드시는 아닙니다).

내 이해에 따르면, 모나드를 구현하는 언어는 정적으로 유형을 확인해야합니다. 그렇지 않으면 편집 중에 유형 오류를 찾을 수 없으며 "복잡성"은 제어되지 않습니다. 내 이해가 맞습니까?

도움이 되었습니까?

해결책

동적으로 입력 한 언어에는 많은 모나드 구현이 있습니다.

일반적으로 교회-링-thesis는 우리에게 할 수있는 모든 것이 하나 언어는 또한 수행 할 수 있습니다 그 밖의 모든 언어.

위의 예제에서 알 수 있듯이, 나는 대부분 루비 프로그래머입니다. 그래서 농담처럼 위의 예 중 하나를 가져 와서 내가 아는 언어로 다시 구현했습니다. 절대적으로 아무것도 없습니다 그것은 일반적으로 매우 강력한 언어로 생각되며, 그것은 내가 Monad 튜토리얼을 찾을 수 없었던 지구상에서 유일한 프로그래밍 언어 인 것 같습니다. 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);
  }
));
?>

정적 유형, 제네릭, 클로저가 필요하지 않습니다.

이제 실제로 Monads를 정적으로 확인하려면 정적 유형 시스템이 필요합니다. 그러나 그것은 다소 타우 폴로지입니다. 정적으로 유형을 확인하려면 정적 유형 검사기가 필요합니다. 듀.

귀하의 질문과 관련하여 :

내 이해에 따르면, 모나드를 구현하는 언어는 정적으로 유형을 확인해야합니다. 그렇지 않으면 편집 중에 유형 오류를 찾을 수 없으며 "복잡성"은 제어되지 않습니다. 내 이해가 맞습니까?

당신이 옳지 만 이것은 모나드와 아무 관련이 없습니다. 이것은 일반적으로 정적 유형 검사에 관한 것이며 어레이, 목록 또는 평범한 지루한 정수에 똑같이 적용됩니다.

여기에는 빨간 청어가 있습니다. 예를 들어 C#, Java 또는 C의 Monad 구현을 보면 위의 PHP 예보다 훨씬 길고 훨씬 더 복잡합니다. 특히, 거기에 있습니다 어디에나 유형이 있으므로 확실히 외모 감동적인. 그러나 추악한 진실은 다음과 같습니다. C#'s, Java's 및 C의 유형 시스템 Monad. 특히, Monad RANK-2 다형성 유형이지만 C# 및 Java는 Rank-1 다형성 ( "제네릭"이라고 부르지 만 동일) 만 지원하고 C는 그조차도 지원하지 않습니다.

따라서 Monads는 사실입니다 ~ 아니다 C#, Java 및 C에서 정적으로 유형 확인 된 (예를 들어 Linq Monad 이해가 패턴으로 정의되는 이유와 같은 이유는 다음과 같습니다. 표현하다 C#의 유형은 모든 정적 유형 시스템이 실제로 도와주지 않고 구현을 훨씬 더 복잡하게 만드는 것입니다. Monads의 실제 유형 안전성을 얻으려면 Haskell과 같은 훨씬 더 정교한 유형 시스템이 필요합니다.

참고 : 위에서 쓴 내용 제네릭에 적용됩니다 monad @porges가 지적한대로 자체를 입력하십시오. 당신은 확실히 어떤 유형을 표현할 수 있습니다 특정한 모나드, 좋아요 List 또는 Maybe, 그러나 당신은 유형을 표현할 수 없습니다 Monad 그 자체. 그리고 이것은 당신이 사실을 입력 할 수 없다는 것을 의미합니다.List IS-A Monad"그리고 모든 인스턴스에서 작동하는 일반 작업을 입력 할 수는 없습니다. Monad.

(그것을 확인하십시오 Monad 또한 모나드를 순종합니다 법률 모나드를 준수하는 것 외에도 유형 Haskell의 유형 시스템에도 너무 많을 것입니다. 당신은 아마도 종속 유형과 아마도 본격적인 자동 정리 속담이 필요할 것입니다.)

다른 팁

모나드를 구현하는 언어가 ~ 해야 하다 질문 제목이 묻는대로 정적으로 입력하십시오. 당신이 설명하는 이유는 좋은 생각 일 수 있지만 컴파일 시간에 감지되지 않은 오류는 아무도 멈추지 않았습니다. 얼마나 많은 사람들이 PHP를 쓰는지보십시오.

State Monad의 폐쇄가 필요합니다. 나는 그것을 찾았다. PHP는 5.3 이후로 폐쇄된다. 그래서 그것은 더 이상 문제가되지 않을 것입니다.

아니요, PHP에서는 모나드를 구현할 수 없습니다. 당신은 그것을 위해 폐쇄가 필요합니다. 더 적은 것은 결코 클래스와 패턴 일치를 시뮬레이션 할 때 여전히 유용 할 수 있습니다.

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());
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top