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.