2012-07-03 20 views
14

Estoy intentando asimilar & trabajo con Arrows, y estoy teniendo algunas dificultades. Tengo un contexto en el que necesito un Arrow [a] [b], y quiero escribir un Arrow a b y asignarlo/secuenciarlo dentro de la flecha, a la mapM. Específicamente, la flecha es un Hakyll Compiler, pero no creo que eso sea demasiado importante para la respuesta.Flecha equivalente a mapM?

dado una flecha

myInnerArrow :: Arrow a => a b c 

¿Cómo puedo levantar esto en una flecha

myOuterArrow :: Arrow a => a [b] [c] 

?

He rastreado la biblioteca base, particularmente en Data.List y Control.Arrow, pero no encuentro nada que parezca que hará el trabajo. ¿Existe bajo un nombre que no espero? ¿Lo proporciona alguna otra biblioteca? ¿Es imposible escribir por alguna razón?

+0

Seguimiento: Hakyll tiene una función 'mapCompiler'. –

Respuesta

14

No se puede elegir. La función de elevación tendrá este tipo:

mapA :: (ArrowChoice a) => a b c -> a [b] [c] 

La forma más fácil de poner en práctica es el uso de la notación proc:

mapA c = 
    proc xs' -> 
     case xs' of 
      [] -> returnA -< [] 
      (x:xs) -> uncurry (:) ^<< c *** mapA c -< (x, xs) 

código no probado, pero debería funcionar. Sin embargo, tenga en cuenta que una función genérica va a ser muy lenta. Recomiendo escribir esta función de mapeo específicamente para su flecha.