2009-10-03 5 views
7

새로운 프로그래밍 과목에 대해 배울 때 나는 보통 다음과 같은 패턴을 따른다. 나는 그것에 대해 읽었고, 이해하고 몇 가지 예제를 작성하여 코드를 .학습 운동을 찾고 있습니다.이 모나드를 구현하십시오.

나는 모나드에 대해 많이 읽었으며 이해하고 받아 들일 확신이 있습니다. 이제는 실제로 이해할 수있는 몇 개의 모나드를 코딩하고 다양한 유형의 코드를 구현하기 위해 무엇이 필요한지 알아 내려고합니다.

문제는 많은 모나드를 구현할 수 없다고 생각하므로 권장 사항을 찾고 있습니다. 가급적 간단하고 쉬운 것들과 쉬운 것들을 추천 목록으로 만들고 싶습니다.

또한 모나드는 기능적 프로그램에서 부작용을 '캡슐화'하는 데 사용되지만 그보다 훨씬 일반적인 것으로 알고 있습니다. 그래서, 권고안은 부작용과 일반적인 것들을 요약하는 모나드를 포함하고 싶습니다.

감사합니다.

(참고로 : 나는이 작업을하기 위해 f #으로 작업 할 것이지만이 질문은 모든 기능적 언어에 적용될 수 있다고 생각합니다.)

답변

5

All About Monads의 카탈로그가 좋은 시작이라고 생각합니다 (연속 모나드는 실제로 이극 변태에 유용합니다, 예 : here 참조). 또한 parsers이고 가능하면 transactional effects입니다. 은 독자적으로 구현하려고하는 또 하나의 훌륭한 도구입니다 (논리적으로 단일 스레드 코드가 아닌 다른 실제 스레드에서 비 차단).그리고 Reactive Framework의 기본 모나드는 좋은 진보 된 도전처럼 보입니다.

2

일종의 모나드 법칙을 따르는 데이터 구조/계산 목록은 매우 풍부합니다.

선택적인 데이터 (F #에서 'a option)를 넘는 목록부터 파서와 같이 매우 복잡한 항목까지 연속 및 멀티 스레딩에 이릅니다.

일부 구현하기 시작하십시오. 기본 exercies는 :

// Identity monad 

let something = ident { 
    let! value = id 42 
    return value 
} 

let somethingelse = ident { 
    let! value = something 
    let! otherValues = id 40 
    return value + othervalue 
} 


// Implement maybe for 'a option 
let sum = maybe { 
    let! a = maybeInputNumber("a") 
    let! b = maybeInputNumber("b") 
    let! c = maybeInputNumber("c") 
    return a + b + c 
} 

match sum with 
| None -> ... 
| Some(n) -> ... 

또한 도우미 기능과 명시 적 모나드 구문으로 litte 비트를 재생하여 이해를 높일 수 있습니다. 당신은 몇 가지 복잡한 예를 원하는 경우에

// Given m >>= f for m.Bind(f) 

let (>-) f monad = monad >>= (fun k -> return(f x)) 

// What's this? 
let res = ((+) 1) >- [1..10] 

monadic parser combinators를보십시오. 이것은 다음과 같은 유형에 대한 간단한 구현의 기반이

let parseVector = parser { 
    do! ignore $ char '(' 
    let! [x;y;z] = sepBy parseNumber "," 
    do! ignore $ char ')' 
    return new Vector(x, y, z) 
} 

합니다 (FParsec - 프로젝트에서보세요) 당신이 일반 F #으로 복잡한 재귀 하강 파서를 구현 할 수 있습니다 :

type 't Computation = 
    | Error of ... 
    | Result of 't 

type Input  = char list 
type 'a Parser = Input -> (('a * Input) Computation) 

에 시도 바인드수익을 구현 ;-)

그리고 일반적인 팁으로 : 당신이 정말로 그들의 자연 환경에서 모나드를 이해하려면 ' 하스켈을 사용해야합니다 ;-) F #에는 모호한 아날로그 계산식 만 있지만 하스켈은 모나드 계산을위한 일반 인터페이스를 도입했습니다. 그들을 시험해 보는 것은 완전하다!

1

하스켈이 모나드에 대해 배우는 자연어라는 사실에 도전할만한 것은 없다고 생각하지만, 모나드 계산을 모나드 계산을 모아 놓고 사용하지 않는 언어로 가져 오는 것이 좋습니다. 하스켈 같은 슈퍼 부드러운 지원. 그것은 모든 언어로 가능하며, 합리적으로 높은 수준의 언어로 창조적이며 사실상 멋지게 만들 수 있습니다 - 과정에서 많은 것을 배울 수 있습니다! 파이썬 (예를 들어, Valued Lessons에서)에 대한 멋진 모나 딕 구문을 보았습니다.

Lisp에서 모나드를 사용하기에 좋은 기능을 제공하는 Clojure의 clojure.contrib.monads 라이브러리가 있습니다. 그것의 일부를 기능적으로 재현하려는 것은 상당히 유익 할 것입니다. 또한 Haskell 대신에 때때로 이것을 사용하면 Haskell의 구문에 대한 일반적인 패턴을 분리하는 데 도움이 될 수 있습니다 (물론 입니다. 확실히입니다.).

관련 문제