在Haskell中将Writer monad与Conduit结合使用

和位置

作为学习Haskell,Conduit和Monads的练习,我想创建一个告诉输入值并将其传递的管道

代码很简单,但是我遇到的编译错误对我来说仍然是个隐秘的问题:

 log =
    await >>= \case
      Nothing -> return ()
      Just value -> do
        tell [value]
        yield value

 runWriter $ CL.sourceList ["a", "b"] $= log $$ CL.consume

错误:

 No instance for (MonadWriter [o0] m0) arising from a use of ‘tell’
 The type variables ‘m0’, ‘o0’ are ambiguous
 Relevant bindings include
   value :: o0
     (bound at /home/vagrant/workspace/dup/app/Main.hs:241:10)
   logg :: ConduitM o0 o0 m0 ()
     (bound at /home/vagrant/workspace/dup/app/Main.hs:238:1)
 Note: there are several potential instances:
   instance MonadWriter w m => MonadWriter w (ConduitM i o m)
     -- Defined in ‘conduit-1.2.6.4:Data.Conduit.Internal.Conduit’
   instance MonadWriter w m =>
            MonadWriter
              w (conduit-1.2.6.4:Data.Conduit.Internal.Pipe.Pipe l i o u m)
     -- Defined in ‘conduit-1.2.6.4:Data.Conduit.Internal.Pipe’
   instance [safe] MonadWriter w m =>
                   MonadWriter w  (Control.Monad.Trans.Resource.Internal.ResourceT m)
     -- Defined in ‘Control.Monad.Trans.Resource.Internal’
   ...plus 11 others
 In a stmt of a 'do' block: tell [value]
 In the expression:
  do { tell [value];
       yield value }
 In a case alternative:
    Just value
      -> do { tell [value];
              yield value }
埃里克

这对我有用:

{-# LANGUAGE FlexibleContexts #-}

import Data.Conduit
import Control.Monad.Writer
import qualified Data.Conduit.List as CL

doit :: MonadWriter [i] m => Conduit i m i
doit = do
  x <- await
  case x of
    Nothing -> return ()
    Just v  -> do tell [v]; yield v; doit

foo = runWriter $ CL.sourceList ["a", "b", "c"] =$= doit $$ CL.consume

请注意,我将名称从更改为logdoit以避免名称与冲突Prelude.log

更新

如果您从以下内容开始:

import Data.Conduit
import Control.Monad.Writer
import qualified Data.Conduit.List as CL

doit = do
  x <- await
  case x of
    Nothing -> return ()
    Just v -> do tell [v]; yield v; doit

您将收到两个错误:

No instance for (Monad m0) arising from a use of ‘await’
...

No instance for (MonadWriter [o0] m0) arising from a use of ‘tell’
...

由于doit是顶级功能,经验会告诉您,单态性限制可能在这里起作用。确实,在添加之后:

{-# LANGUAGE NoMonomorphismRestriction #-}

您只会得到一个错误:

Non type-variable argument in the constraint: MonadWriter [o] m
(Use FlexibleContexts to permit this)
...

在添加之后FlexibleContexts,代码将编译。

现在,您可以询问以下类型doit

ghci> :t doit
doit :: MonadWriter [o] m => ConduitM o o m ()

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在foldl函数Haskell中添加Writer Monad

来自分类Dev

Writer monad的使用

来自分类Dev

haskell:在haskell平台2013 2.0.0上使用writer monad时(Monoid Int)没有实例

来自分类Dev

在多个包中找到了Control.Monad.Writer haskell

来自分类Dev

无法从“了解Haskell”中编译Writer Monad示例

来自分类Dev

Haskell:使用monad类

来自分类Dev

在ghci中使用Writer monad的问题

来自分类Dev

使用Monad.Writer计算正弦函数

来自分类Dev

如何在Haskell中将功能正常的DSL转换为Monad?

来自分类Dev

在 Haskell 中将元素与概率结合起来

来自分类Dev

使用IO monad的Haskell单元测试

来自分类Dev

重构使用Reader monad的Haskell函数

来自分类Dev

Haskell中使用Monad的LZW例程

来自分类Dev

Haskell:使用monad链接函数时出错

来自分类Dev

Haskell中使用Monad的LZW例程

来自分类Dev

Haskell:使用monad链接函数时出错

来自分类Dev

在Haskell使用monad变压器RWST

来自分类Dev

将Reader monad与QuickCheck / monadicIO结合使用

来自分类Dev

如何在Scala中使用Reader and Writer monad?

来自分类Dev

如何在Scala中使用Reader and Writer Monad?

来自分类Dev

在Swift中将UIScrollView与UIVisualEffectView(UIBlurEffect)结合使用

来自分类Dev

在NSFetchRequestController中将NSFetchRequest与复杂的NSPredicate结合使用

来自分类Dev

在Android中将SOAP与WSDL结合使用

来自分类Dev

在MongoDB中将ObjectId与Mongoose结合使用

来自分类Dev

在Elasticsearch中将MinimumShouldMatch与术语查询结合使用

来自分类Dev

如何在xpath中将not()与'and'结合使用

来自分类Dev

如何在PLPGSQL中将WITH与FOR循环结合使用?

来自分类Dev

在dplyr中将变量与.data [[]]结合使用

来自分类Dev

在Java中将BoxLayout Manager与JLabels结合使用

Related 相关文章

热门标签

归档