[Haskell-beginners] Trying to write netwire combiner similar to multicast

Nathan Hüsken nathan.huesken at posteo.de
Mon Nov 5 17:04:51 CET 2012


Hey,

I am trying to write a netwire combiner similar to multicast. The only
difference is that when one of the wires inihibts, I want to remove it
from the list.

So this is my attempt:

manager :: (Monad m) => [Wire e m a b] -> Wire e m [a] [b]
manager ws' = mkGen $ \dt xs' -> do
            res <- mapM (\(w,x) -> stepWire w dt x) $ zip ws' xs'
            let filt (Left a, b) = Just (a, b)
                filt _           = Nothing
                resx = mapMaybe filt res
            return (Left $ (fmap fst) resx,manager (fmap snd resx))

ghc gives this compiler error:

BreakoutImproved.hs:90:62:
    Couldn't match type `e' with `[e]'
      `e' is a rigid type variable bound by
          the type signature for
            manager :: Monad m => [Wire e m a b] -> Wire e m [a] [b]
          at BreakoutImproved.hs:85:1
    Expected type: [(e, Wire [e] m a b)]
      Actual type: [(e, Wire e m a b)]
    In the second argument of `fmap', namely `resx'
    In the first argument of `manager', namely `(fmap snd resx)'

Now this, I do not get.
Why does manager expect an argument of type [(e, Wire [e] m a b)].
The type signature clearly says [(e, Wire e m a b)] (which is what it is
getting).

Thanks!
Nathan



More information about the Beginners mailing list