【问题标题】:How to "wrap" monadic return value如何“包装”一元返回值
【发布时间】:2015-06-16 10:35:33
【问题描述】:

我有以下代码:

data APNSIdentifier = NoIdentifier | Identifier Word32 deriving (Show, Eq)
newtype APNSItem = Item Put

createNotificationIdentifierItem :: APNSIdentifier -> APNSItem   <--- here
createNotificationIdentifierItem (Identifier identifier) = do
    putWord8 3
    putWord16be 4
    putWord32be identifier

如何用APNSItem“包装”Put monad?我必须将APNSItem 设为Monad 类型类的实例还是有更简单的解决方案?

【问题讨论】:

  • 记住 do 符号是 >>= 和 >> 的糖。那里的类​​型签名表明您必须在 块之外执行此操作。

标签: haskell monads


【解决方案1】:
createNotificationIdentifierItem :: APNSIdentifier -> APNSItem
createNotificationIdentifierItem (Identifier identifier) = Item $ do
    putWord8 3
    putWord16be 4
    putWord32be identifier

createNotificationIdentifierItem :: APNSIdentifier -> APNSItem
createNotificationIdentifierItem (Identifier identifier) = do
    Item $ putWord8 3
    Item $ putWord16be 4
    Item $ putWord32be identifier

在使APNSItem 成为Monad 的实例之后(您可以使用GeneralizedNewtypeDeriving 执行此操作,但您需要先修复APNSItem 以拥有单个类型变量)

【讨论】:

  • 在没有 GeneralizedNewtypeDeriving 的情况下,第二种方法如何工作?
  • @Alexander 没有。
猜你喜欢
  • 2016-05-22
  • 2015-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-19
相关资源
最近更新 更多