2016-11-19 7 views
3

AFAIK GHC8에 새로운 추가 중 하나는 대응 Applicative 방법 (<$>, <*>) 가능한 경우에 DO-표기 desugars ApplicativeDo 언어 확장이다 ApplicativeDo. 나는 다음과 같은 질문을 가지고있다.하스켈

Applicative 방법으로 desugaring 할 수 있는지 여부를 어떻게 결정합니까? 내가 아는 바로는, (나중에 나중의 결과에 의존하는 경우) 의존성 검사를 통해 자격을 결정합니다. 다른 기준이 있습니까?

이 추가 기능으로 Monad 인스턴스가없는 클래스 (어쩌면?)에 대한 응용 프로그램 코드를 읽기 쉽게 만듭니다. Monad와 Applicative 인스턴스를 모두 가지고있는 구조의 경우 : 이것은 가독성 측면에서 권장되는 방법입니까? 다른 혜택이 있습니까?

답변

8

Applicative 방법으로 desugaring 할 수 있는지 여부는 어떻게 결정됩니까? 내가 아는 바로는, (나중에 나중의 결과에 의존하는 경우) 의존성 검사를 통해 자격을 결정합니다. 다른 기준이 있습니까?

papertrac page은 최상의 정보 출처입니다. 어떤 점수

  • ApplicativeDo가 applicatives 가능한 이용 - 의존성 유향 그래프의 일종을 참조하도록 구성된다
  • do 블록의 일부분 만 실용적이다 어떤 경우 >>=로 혼합 포함한 어느 부분 일 수있다 "parallelized"
  • 때로는이 그래프의 명백한 최상의 번역이 없습니다! 이 또한 어떤 Monad 인스턴스가없는 클래스를 읽어 실용적 코드는 쉽게하지만이 경우, GHC는 (대략 말하기)입니다 번역 로컬 작은

을 선택 (아마도?). 그러나 MonadApplicative 인스턴스가있는 구조의 경우 : 이는 가독성 측면에서 권장되는 방법입니까? 다른 혜택이 있습니까? ApplicativeMonad와의 차이에 대해

Here is an answer. 직접 인용하면

<*>를 배포하려면, 당신은 두 개의 연산, 함수 중 하나, 인수의 다른 후, 그 값은 응용 프로그램에 의해 결합을 선택합니다. >>=을 배포하려면 하나의 계산을 선택하고 결과 값을 사용하여 다음 계산을 선택하는 방법을 설명합니다. "배치 모드"와 "대화식"작업의 차이점입니다.

가장 좋은 예는 Haxl 모나드 (페이스 북 디자인)로, 외부 소스에서 데이터를 가져 오는 것입니다. Applicative을 사용하면 이러한 요청은 병렬로 발생할 수 있으며 Monad은 요청을 순차적으로 처리해야합니다. 실제로,이 예제는 Facebook의 Simon Marlow가 처음에 ApplicativeDo 확장자를 작성하고 인용 된 논문을 작성하게 한 동기입니다.

일반적으로 대부분의 Monad 인스턴스는 Applicative의 혜택을받을 필요는 없습니다. 같은 대답에서 나는 위에 인용 :

내가 ApplicativeDo 더 실용적 만들 수있는 좋은 방법입니다 감사 (빠른 의미 경우에) 당신이 시간을하지 않은 모나드 스타일로 작성된 프로그램을 리펙터. 하지만 그렇지 않으면, 나는 모나드 - 할아버지 - 할 수있을 때 - 언제 - 할 일이 일어나고 있는지를 보는 더 좋은 방법이라고 주장 할 것입니다.

그래서 : 사용 ApplicativeMonad 이상 가능하면, 정말로 해당 실용적 표현보다 (이 페이스 북에서 어떤 경우에 틀림처럼) 쓸 좋네요 때 ApplicativeDo을 악용.