2013-07-16 88 views
2

在Haskell中與Writer Monad進行模式匹配的正確方法是什麼?Haskell與Writer Monad是否有匹配的匹配?

我想去做以下...

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

其實,我真的不知道WriterWriterTWriter.Identity間的差異等...

任何指導,將不勝感激,感謝您的閱讀。

+0

您可能想要查看[source](http://hackage.haskell.org/packages/archive/mtl/1.1.0.2/doc/html/src/Control-Monad-Writer-Lazy.html#Writer )Writer and WriterT – e19293001

+0

爲什麼你想在之後放棄書面結果時寫一個作家?或者用不同的話來說,你爲什麼需要一個作家,你不能只用一個純函數嗎? – Laar

+0

以上函數只是示例。在真實代碼中,我總是使用Writer和monad函數(>> =)。 –

回答

1

如果我已正確理解您要做的事情,則可以使用runWriterWriter中獲取((Int, String), [Int]),然後從中提取字符串。可能是類似snd . fst . runWriter ...

WriterT是您在使用時需要將Writer與其他monad結合使用。不是爲WriterWriterT編寫單獨但相似的實現,而是僅編寫WriterT的實現並將Writer定義爲使用Identity monad的WriterT更容易。 monad實際上並沒有做任何事情;你可以簡單地假裝它不在那裏。

+0

謝謝。我知道'runWriter'功能。但'讓s = snd $ fst $ runWriter w'太長了。我希望我可以通過模式匹配獲得內容。 –

+1

你不能模式匹配,因爲它不是一個新的數據類型 – Ankur

+0

我明白了..謝謝! –