2013-07-16 1 views
2

Haskell의 Writer Monad와 패턴 일치를 수행하는 올바른 방법은 무엇입니까?하스켈의 Writer Monad와 Patten이 일치합니까?

나는 다음과 같이 수행 할

...

import Control.Monad.Writer 
hoge :: Writer [Int] (Int, String) -> String 
hoge (Writer (_, (_, s))) = s 

사실, 난 정말 모든 지침을 감상 할 수있다

WriterWriterTWriter.Identity 사이의 차이를 모르겠어 ..., 읽어 주셔서 감사합니다.

+0

[소스] (http://hackage.haskell.org/packages/archive/mtl/1.1.0.2/doc/html/src/Control-Monad-Writer-Lazy.html#Writer)를 볼 수 있습니다.) – e19293001

+0

왜 나중에 작성한 결과를 무시할 때 작성자를 만들고 싶습니까? 아니면 다르게 말하면 왜 작가가 필요하며 순수한 함수를 사용할 수 없습니까? – Laar

+0

위 함수는 예제 일뿐입니다. 실제 코드에서는 Writer를 항상 모나드 함수 (>> =)와 함께 사용합니다. –

답변

1

내가 무엇을 하려는지 정확히 이해했다면 runWriter을 사용하여 Writer에서 ((Int, String), [Int])을 얻은 다음 해당 문자열을 추출 할 수 있습니다. 아마도 snd . fst . runWriter ...과 같은 것입니다.

WriterTWriter을 다른 모나드와 결합해야 할 때 사용합니다. WriterWriterT에 대해 별개이지만 유사한 구현을 작성하는 대신 WriterT에 대한 구현을 작성하고 Identity 모나드를 사용하는 WriterT으로 Writer을 정의하는 것이 더 쉬웠습니다. Identity 모나드는 실제로 아무 것도하지 않습니다. 당신은 단순히 그것이 존재하지 않는다고 가장 할 수 있습니다.

+0

감사합니다. runWriter 함수를 알고 있습니다. 그러나'let s = snd $ fst $ runWriter w'가 너무 길다. 패턴 일치로 콘텐츠를 얻을 수 있었으면 좋겠습니다. –

+1

새로운 데이터 형식이 아니므로 패턴 일치를 수행 할 수 없습니다. – Ankur

+0

나는 ... 감사합니다. –