모나드를 구현하는 언어가 정적으로 입력되어야합니까?
-
23-08-2019 - |
문제
기능적 프로그래밍 스타일을 배우고 있습니다. ~ 안에 모나드를 두려워하지 마십시오, Brian Beckman은 Monad에 대해 훌륭한 소개를했습니다. 그는 모나드가 복잡성을 다루기 위해 기능의 구성에 관한 것이라고 언급했다.
모나드에는 a
unit
유형 t를 증폭 된 유형 m (t)로 전달하는 함수; 및 t에서 m (u)까지의 함수가 주어지면 유형 m (t)를 다른 유형 m (u)로 변환하는 결합 함수. (u는 t 일 수 있지만 반드시는 아닙니다).
내 이해에 따르면, 모나드를 구현하는 언어는 정적으로 유형을 확인해야합니다. 그렇지 않으면 편집 중에 유형 오류를 찾을 수 없으며 "복잡성"은 제어되지 않습니다. 내 이해가 맞습니까?
해결책
동적으로 입력 한 언어에는 많은 모나드 구현이 있습니다.
- 루비의 모나드
- OO Monads와 Ruby (사이트가 다운되었지만 기사입니다 인터넷 아카이브의 웨이백 머신에서 사용할 수 있습니다)
- 루비의 모나드 1 부 : 정체성, 루비 1.5 파트의 모나드 : 정체성, 루비의 모나드 2 부 : 어쩌면 (아마도 다시는 아닐 수도 있습니다)
- 루비의 모나 드
- 저렴한 I : 아마도 자바 스크립트의 모나드, 싸구려에 더 많은 모나드 : Maybe에서 상감
- 루비의 모나드 (좋은 구문과 함께!), Ruby와 Python에 Monad를 나열하십시오
- 루비를위한 Haskell 스타일의 모나드 도트
일반적으로 교회-링-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());