Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 在WriterT中包装以添加日志记录_Haskell_Monad Transformers_Maybe_Writer Monad - Fatal编程技术网

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