2009-05-15 2 views
21

Monads에 대한 영아의 이해가 있다는 것을 밝히자. Monads의 여러 스레드를 읽고 개념에 대해 몇 시간 공부했습니다. 나는 그 용어에 대해 거의 느끼지 않지만, 나는 일반적으로이 모나드가 무엇인지 이해한다고 말하는 것이 안전하다고 생각한다.C#의 Monads 사용에 대한 강력한 시나리오는 무엇입니까

저는 일하는 방식을 개선하기 위해 노력하는 C# 개발자입니다. Monaducation에서 더 이상 도움이되는 것은 oldskool C#에서 같은 종류의 문제를 해결하는 다른 방법보다 분명히 개선 된 L # SelectMany() 또는 somesuch를 통한 C#의 모나드 실제 적용입니다.

그런 짐승을 본 사람이 있습니까?

+0

흥미로운 질문 외에도 나는 "Monaducation"이라는 용어를 좋아했습니다. –

+1

필자는 John Skeet/Tomas Petrecek의 ** Real World Functional Programming **을 읽기 시작했습니다. http://www.amazon.com/Real-World-Functional-Programming-Examples/dp/1933988924/ref=sr_1_1?ie= UTF8 & s = books & qid = 1264373395 & sr = 8-1은이 땅에서 나온 것입니다. –

+1

반응 프레임 워크 (http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx)는 좋은 예입니다. –

답변

11

여기에 하나의 시나리오가 있습니다. 파싱 라이브러리 (포함 된 DSL의 좋은 예)를 작성하고 가장 적합한 것이 모나 딕 파서 연결자 라이브러리라는 것을 알았습니다. 따라서 구문 분석하는 언어의 문법과 동일한 구조를 가진 C# 코드를 작성하기 위해 LINQ 구문 설탕을 활용하여 작성하면 즉시 구문 분석 및 오류 복구를위한 멋진 프로그래밍 모델의 이점을 얻을 수 있습니다 . 설명은 this blog을 참조하십시오.

+0

+1 : 나는 모나드 스타일의 가상 유창한 측면을 이해하기 시작했습니다. 이것은 도움이됩니다. 그 모나드가 몇 가지 보완적인 목표를 달성하기 시작했습니다. 그 중 하나는 가독성이 향상되었습니다. –

4

다음 시나리오 중 하나입니다. 스레드를 보유하지 않고 순차적 비동기 호출 (예 : IO)을 작성하는 코드를 작성하려고하지만 비동기 프로그래밍 모델 (BeginFoo/EndFoo)이 필요없는 희망이없는 스파게티를 작성하고 싶지는 않습니다.) 당신을 강요합니다. 따라서 모나드 및 LINQ 설탕을 사용하고 직선으로 보이는 코드를 작성할 수 있지만 전체적으로 스레드를 릴리스/전환합니다. 간단한 설명은 this blog을 참조하십시오.

0

LINQ는 StackOverflow에서 많은 솔루션 (그리고 종종 질문에서 요구되는)에 사용됩니다. LINQ 태그로 질문을 검토하면 실제 사용법이 표시됩니다. 모나드와

+0

LINQ가 모나드이며, LINQ와 모스 사용법을 만드는 하스켈의 IO() 모나드 사이에 중요한 차이점이 있습니다. C#에서 unpure 아마 모나드의 최고의 examplification ... 아마? 아마 순수한 언어와 비 순응 언어에서 모나드 원칙을 사용하는 것의 차이점에 혼란 스러울 것입니까? –

3
+0

@all : 스팸으로 신고되었습니다. 하지만 사실이 링크는 * 모나드와 관련이 있습니다. 특정 게시물이 더 좋을 수도 있지만 구약은 아닙니다. –

+0

모나드 접근 방식을 사용하는이 C# 예제를 완전히 얻지는 못했지만이 예제에서는 흥미로운 코드입니다. 생각할 게있어. –

0

프로그래밍은 오히려 그것을 생성하는 방법의 낮은 수준의 세부 사항보다 높은 수준에서 원하는 기술, 선언적이다.

을 참조하십시오.

+0

감사합니다. 그것은 도움이되었지만 Beckman이 말하는 것과 상반되지는 않았습니다. 실용적인 사용법이 아니 었습니다. –

5

찾기 피타고라스 수 :합니다 (어쩌면을 모나드 사용하여,보다 구체적으로) 기능, 모나드 스타일 전형적인 필수적 실제 C# 코드 (NuGet에서 함수를) 리팩토링에 대한

var r = from a in Enumerable.Range(1, 25) 
      from b in Enumerable.Range(a, 25-a) 
      from c in Enumerable.Range(b, 25-b) 
      where a*a + b*b == c*c 
      select new [] { a, b, c }; 
+0

좋은. 나는 모나드와 기능적 스타일 사이의 관계를 일반적으로보기 시작했습니다. 이 예제는 두 가지 모두를 잘 표현한 것입니다. –

0

I recently blogged. 합리적인 단계를 설명하면서 작은 단계로 최선을 다 했으므로 모나드가 어떻게 유용했는지 이해하는 데 도움이된다고 생각합니다.

3

과 같이 Maybe 모나드를 사용하여 검사하는 것이 한 가지 예입니다.