2016-08-10 42 views
0

我試圖構建一個haskell模塊,盡我所能,這就是我想出的。構建一個Haskell程序

輸入可以是Fix或Twitter 並且可以輸出解析器的輸出,我想將解析器的輸出標記爲結構化或非結構化。

這是正確的類型簽名?我是否正確使用monad實例類?這是處理哈斯克爾副作用的正確方法嗎?

module Parsers.Parser(
     handle 
    ) where 

data Input = FIX Text 
     | Twitter Text 

data Output = StructuredDataEvent Quote 
      | UnStructuredDataEvent Text 

handle :: Input -> Output 
handle (FIX r)  = fixParser r >>= StructuredDataEvent 
handle (Twitter r) = twitterParser r >>= UnStructuredDataEvent 

sideEffects:: Output -> Output 
sideEffects a = LogEventToDatabase a 

instance Monad Maybe where 
    return x = Just $ sideEffects x 
    Nothing >>= f = Nothing 
    Just x >>= f = f $ sideEffects x 
    fail _ = Nothing 
+1

'Maybe'已經是'Monad'的一個實例。這通常也不清楚你在說什麼。這段代碼是否編譯? – dfeuer

+0

如果這是編制和工作我是不太願意要他到堆棧溢出.... 這個心不是一個標準的單子也許...林伐木的東西到數據庫 返回X =只需$副作用X 僅售X >> = F = F $副作用X 我的問題是,這是否是處理副作用 而且因爲>>正確的做法=可返回任何結果爲: 手柄::輸入 - >輸出 或 手柄::輸入 - >可能輸出 正確的簽名 – Devitect

+1

LogEventToDatabase是做什麼的?這可能不會通過單子法。回答你的問題:不,這不是在Haskell中處理副作用的正確方法。 – pdexter

回答

1

handle應該Input -> IO Output類型的,如果你真的想這樣做的副作用。

但是最好編寫一個純粹的解析器來保存所有錯誤消息的列表。如果他們只是String秒,例如using the Writer monad

handle :: Input -> Writer [String] Output 

而且,你有沒有考慮using Parsec,這是單子轉換?