我试图尽可能地构建一个haskell模块,这就是我想出来的。
输入可以是Fix或Twitter 并且可以输出解析器的输出,我想将解析器的输出标记为Structured或Unstructured。
这是正确的类型签名吗?我正确使用了monad实例类吗?这是处理haskell副作用的正确方法吗?
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
答案 0 :(得分:1)
CGBitmapContextCreate
应该是handle
类型。
但是最好编写一个纯解析器来保存所有错误消息的列表。如果它们只是Input -> IO Output
,例如using the Writer monad:
String
另外,您考虑过using Parsec,这是monad变压器吗?