【问题标题】:Wrapping Maybe in WriterT to add logging在 WriterT 中包装 Maybe 以添加日志记录
【发布时间】:2016-03-27 11:28:16
【问题描述】:

我完全被困住了,我觉得我现在可以使用一些帮助,只是为了保持清醒。我想要一些简单的东西,例如将日志记录功能添加到返回 Maybe 的函数中,但无论我多么努力,我都无法获得正确的类型。

这是(据我所知)我能得到的最接近的:

import Data.Maybe
import Control.Monad
import Control.Monad.Writer

q :: Integer -> Maybe Integer
q x = if x > 7
      then Just x
      else Nothing

qlog :: Integer -> WriterT [String] Maybe Integer
qlog x = do
  tell ["Querying " ++ show x]
  return $ q x

这仍然给我一个打字错误:

Couldn't match type ‘Maybe Integer’ with ‘Integer’
Expected type: WriterT [String] Maybe Integer
  Actual type: WriterT [String] Maybe (Maybe Integer)
In a stmt of a 'do' block: return $ q x
In the expression:
  do { tell ["Querying " ++ show x];
       return $ q x }
In an equation for ‘qlog’:
    qlog x
      = do { tell ["Querying " ++ show x];
             return $ q x }

我应该如何调整代码以使其编译和工作?

非常感谢您的帮助,Haskeller 同胞!

【问题讨论】:

    标签: haskell monad-transformers maybe writer-monad


    【解决方案1】:

    为了进行类型检查,内部 monad 应该是 lifted:

    lift :: (Monad m, MonadTrans t) => m a -> t m a
    

    所以,你需要写而不是return $ q xlift $ q x;如:

    qlog :: Integer -> WriterT [String] Maybe Integer
    qlog x = do
      tell ["Querying " ++ show x]
      lift $ q x
    

    【讨论】:

    • 这可能是我唯一没有尝试过的,我应该有的。确实有效,谢谢!你让我免于被我的头撞到墙上:-)
    猜你喜欢
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    • 2014-08-10
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多