Haskell 在WriterT中包装以添加日志记录
我完全陷入困境,我觉得我现在需要一些帮助,只是为了保持清醒。我想要一些简单的东西,比如向返回Haskell 在WriterT中包装以添加日志记录,haskell,monad-transformers,maybe,writer-monad,Haskell,Monad Transformers,Maybe,Writer Monad,我完全陷入困境,我觉得我现在需要一些帮助,只是为了保持清醒。我想要一些简单的东西,比如向返回的函数添加日志功能,可能是,但是无论我怎么努力,我都无法获得正确的类型 这是(据我所知)我能得到的最接近的结果: import Data.Maybe import Control.Monad import Control.Monad.Writer q :: Integer -> Maybe Integer q x = if x > 7 then Just x else
的函数添加日志功能,可能是
,但是无论我怎么努力,我都无法获得正确的类型
这是(据我所知)我能得到的最接近的结果:
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 }
我应该如何调整代码以使其编译和工作
非常感谢你的帮助,哈斯凯勒兄弟 为了进行类型检查,内部单子应为: 因此,您需要编写:
lift$qx
,而不是return$qx
;例如:
qlog :: Integer -> WriterT [String] Maybe Integer
qlog x = do
tell ["Querying " ++ show x]
lift $ q x
这可能是我唯一没有尝试的东西,我应该尝试。它确实有效,谢谢你!你救了我,让我的头不再撞到墙上:-)
qlog :: Integer -> WriterT [String] Maybe Integer
qlog x = do
tell ["Querying " ++ show x]
lift $ q x