Monads는 어떤 프로그래밍 문제를 해결합니까? [닫은]


14

나는 모나드가 무엇인지, 어떻게 unit그리고 bind작동 하는지 설명하는 많은 게시물을 읽었습니다. 부리 토, 상자 등.

몇 주 동안의 연구와 많은 프라이드 뉴런 이후, 나는 Monads가 어떻게 작동하는지 이해합니다. 그러나 여전히 내 이해를 피할 수있는 한 가지 사항이 있습니다 .IO와 상태를 제외하고 실제로는 거의 소식이 거의 없습니다.

왜?

Monads는 왜 중요한가? 왜 그렇게 중요합니까? 그들이 해결하고있는 문제는 무엇입니까? 이러한 문제는 Monads로만 해결할 수 있습니까 아니면 다른 방법이 있습니까?


3
프로그램은 크고 복잡합니다. 우리는 그것들을 구성하는 방법이 필요합니다. 여러 가지 방법이 있습니다. 모나드는 하나입니다. 화살표는 하나입니다. 펑 터는 하나입니다. 객체, 클래스, 함수, 메소드, 모듈, 속성, 믹스 인, 패키지 등이 있습니다. 특정 질문이 무엇인지 명확하지 않습니다. 왜 우리가 프로그램을 구성해야하는지 묻고 있습니까?
Jörg W Mittag

1
@ JörgWMittag : 프로그램을 구성해야하는 이유를 묻지 않습니다. 분명히 큰 문제는 더 작은 문제로 나뉘어 해결 한 다음 결합하여 큰 문제를 해결할 수 있습니다. Monads가 어떤 문제를 해결하는지 묻습니다. 그게 다야? 코드 구조? 모든 소란이 있습니까? 예를 들어, Haskell에서는 이것이 I / O를 수행하는 방법입니다. 거기에서 모나드는 실제로 그렇지 않은 경우 순수한 것처럼 행동하는 연극입니다. 내 질문은 제목에 있으며, 더 명확하게 진술하는 방법을 모르겠습니다.
Dummy Me



1
@RobertHarvey : 또한 추가 한 첫 번째 링크 두 개를 찾았지만 해당 게시물 및 기타 게시물의 답변과 마찬가지로 응답은 Maybe, State 및 IO 모나드로 곧바로 이동하여 예제 또는 코드로 빠르게 이동하여 "많은 내용이 있습니다. Monads를 사용하여 해결할 수있는 문제 " 다른 종류의 문제는 무엇입니까? 나는 동일한 예제를 반복하는 대신 실제로 문제의 근원 (문제가 무엇이든)으로 가서 Monads가 문제를 해결하는 방법과 다른 것을 사용하는 것이 아니라 왜 최선의 선택인지 설명하는 더 높은 수준의 대답을 찾고 있습니다. 피드백에 감사드립니다.
Dummy Me

답변:


10

아무것도 해결하기 위해 모나드가 필요 하지 않습니다 . 그들은 단지 특정 일을 더 단순하게 만듭니다. 모나드를 설명 할 때 많은 사람들이 너무 추상적이며 이론적으로 진행됩니다. 대부분 모나드는 프로그래밍에서 반복해서 나타나는 패턴입니다. 이 패턴을 인식함으로써 코드를 단순화하고 특정 기능의 재 구현을 피할 수 있습니다.

하스켈의 경우, 모나드에서 가장 눈에 띄는 것은 표기법 입니다. Haskell과 다른 언어의 목록 이해 도 모나드를 많이 활용합니다. Control.Monad 와 같은 라이브러리를 만들 수도 있습니다 .

이것들은 모두 유용한 단순화를 제공하며 한 모나드에 대해 구현하면 모든 모나드에 대해 자동으로 가져옵니다 . 이것이 코드 재사용이 다른 패러다임보다 기능 프로그래밍에 훨씬 더 쉬운 주요 이유 중 하나입니다.


2
실제로 하스켈 모나드가 가장 눈에 띄는 것은 실제로 예상 한 방식으로 IO 효과를 얻는 쉬운 방법이라고 말하고 싶습니다. 모나드가 우리에게 무엇을 주는지 궁금해하는 사람은 미란다를 시험해보아야한다 . Miranda는 Haskell이 대체하도록 고안된 언어이므로 Haskell 경험이있는 사람이라면 누구나 쉽게 배울 수 있습니다. 가장 큰 차이점은 모나 딕 IO가 없다는 점인데, 이는 사소한 프로젝트에서 하스켈보다 언어를 다루기가 훨씬 어렵습니다.
Jules

예, IOHaskell의 가장 유명한 모나드 이지만 개별 모나드의 예를 나열하지 않았습니다. 나는 그들이 가능하게하는 가장 중요한 추상화의 예를 열거하고 있었다. 예를 들어 IO에 모나드를 사용한다고 생각한 첫 번째 사람이 일반적으로 좋은 생각이라고 생각하는 이유를 알아 내려고했습니다.
Karl Bielefeldt

1
@ 줄 : 또는 Haskell의 역사를보십시오. Monads 이전에 Haskell 설계자는 I / O의 기초로 Lazy Streams 및 Continuations를 실험했으며 둘 다 사용하기가 어려웠습니다.
Jörg W Mittag

5

특정 모나드를보고 그들이 해결하는 문제를 확인하면 이해하기가 더 쉽습니다. 예를 들어, Haskell에서 :

  • IO : IO를 유형 시스템에 표시 할 수 있으므로 IO를 수행하는 함수에서 순수한 기능을 명확하게 분리 할 수 ​​있습니다.

  • 목록 : 목록 이해 및 노드 종료 계산을 수행 할 수 있습니다.

  • 아마도 : null에 대한 더 나은 대안이며 C #의 null-coalescing 연산자와 비슷한 것을 지원합니다.

  • 파섹 : 파서를 작성하기위한 편리한 DSL.

따라서 개별 모나드에 대한 이론적 근거는 모두 매우 유용하기 때문에 쉽게 알 수 있습니다. 그러나 그들이 해결하는 문제는 상당히 다르며, 그 문제에 관해서는 체인 작업의 일부 논리와 관련이 있다는 점을 제외하고는 공통점이 많지 않습니다. Monad는 다양한 도구를 만들 수 있기 때문에 유용합니다.

위의 예를 모나드없이 구현할 수 있습니까? 확실히 그것들은 임시 방식으로 구현 될 수 있지만, 언어에 모나드가 내장되어 do있으면 모든 모나드와 작동 하는- 표기법 과 같은 언어를 직접 지원할 수 있습니다 .


2

이 혼란하게 한 가지입니다 같은 "인기있는"기능 bind<*> 이 실습 중심적 입니다. 그러나 개념을 이해하려면 다른 기능을 먼저 보는 것이 더 쉽습니다. 모나드는 다른 연결된 개념에 비해 약간 과장되어 있기 때문에 눈에 띄는 점이 있습니다. 펑터부터 시작하겠습니다.

펑 터는 기능을 제공합니다 (하스켈 표기법으로) fmap :: (Functor f) => (a -> b) -> f a -> f b. 다시 말해서 f함수를 들어 올릴 수 있는 컨텍스트 가 있습니다. 당신이 상상할 수 있듯이 거의 모든 것이 functor입니다. 목록, 어쩌면, 함수, I / O, 튜플, 파서 ... 각각은 값이 나타날 수있는 컨텍스트를 나타냅니다. 따라서 fmap인라인 변형 을 사용하여 거의 모든 상황에서 작동하는 매우 다양한 기능을 작성할 수 있습니다 <$>.

컨텍스트와 관련하여 다른 작업을 원하십니까? 두 컨텍스트를 결합 할 수 있습니다. 따라서 다음 zip :: [a] -> [b] -> [(a,b)]과 같은 일반화를 원할 수 있습니다 .pair :: (Monoidal f) => f a -> f b -> f (a,b) .

그것은 훨씬 더 유용 실제로 때문에 그러나, 하스켈 대신 제공하는 도서관 Applicative의 조합이다, Functor하고 Monoidal, 또한의 Unit당신이 실제로 값 "내부"와 컨텍스트를 넣을 수있는 추가하는 unit.

작업중인 컨텍스트에 대해이 세 가지 사항 만 명시하면 매우 일반적인 함수를 작성할 수 있습니다.

Monad그 위에 말할 수있는 또 다른 것입니다. 이전에 언급하지 않은 것은 이미 두 가지 컨텍스트를 결합하는 두 가지 방법이 있다는 것입니다. 두 가지 컨텍스트를 결합 pair할 수있을뿐만 아니라 스택 할 수도 있습니다 (예 : 목록 목록을 가질 수 있음). I / O 컨텍스트에서 예제는 파일에서 다른 I / O 작업을 읽을 수있는 I / O 작업이므로 type이 FilePath -> IO (IO a)있습니다. 우리는 어떻게 그 스태킹을 제거하여 실행 가능한 함수를 얻을 수 IO a있습니까? 그것이 Monads를 join들어오는 곳 이며, 같은 유형의 두 가지 컨텍스트를 결합 할 수 있습니다. 파서, 어쩌면 등도 마찬가지입니다 bind. 더 실용적인 방법입니다.join

따라서 모나드 컨텍스트는 네 가지만 제공하면되며 I / O, 파서, 오류 등을 위해 개발 된 거의 모든 기계와 함께 사용할 수 있습니다.


1

Monads를 사용하면 다양한 비 순수 계산을 표현하고 코드를 단순화 할 수 있습니다

  • 상태 저장 계산 (모나드를 통한 상태 가져 오기 / 설정)
  • I / O (로깅, UI, 파일 또는 X 목록 생성 / 소비)
  • 또한 "비선형"제어 흐름 (예 : 예외 등)

그리고 중요한 것은 순수한 언어 구조를 훼손하지 않고 더 깨끗한 언어를 얻는 것입니다.


2
사실이지만 모나드의 일부일뿐입니다. 목록 이해력 또는 Maybe외부와 관련이 없습니다.
JacquesB

downvoter가 왜 그렇게했는지 설명하면 도움이 될 것입니다. 이 답변에는 아무런 문제가 없습니다.
Jules

그러나 @JacquesB는 상태가 양호합니다.
Jules

1
월드 타입, 고유 타입, 선형 타입도 가능합니다.
Jörg W Mittag

@Jules 비결정론 모나드 목록은 Stateful? "상태 저장"에 대한 정의가 무엇인지 명확히 할 수 있습니까?
Jack
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.