2012-07-03 56 views
14

我正在嘗試與箭頭合作&,並且遇到了一些困難。我有一個上下文,我需要一個Arrow [a] [b],我想寫一個Arrow a b並將其映射/排列在箭頭內,即la mapM。具體來說,箭頭是一個Hakyll Compiler,但我認爲這對於答案沒有多大意義。等價於mapM的箭頭?

鑑於箭頭

myInnerArrow :: Arrow a => a b c 

我怎樣才能解除這種成箭頭

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

我已經搜遍了基本庫,特別是在Data.ListControl.Arrow,但我找不到任何看起來可以完成這項工作的東西。它是否以我不指望的名字存在?它是否由其他圖書館提供?出於某種原因寫作是不可能的?

+0

後續操作:Hakyll有一個'mapCompiler'函數。 –

回答

14

你不能沒有選擇。提升功能都會有這樣的類型:

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

實現最簡單的方法是使用proc符號:

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

未經測試的代碼,但應該工作。但請注意,泛型將會非常慢的函數。我建議你專門爲你的箭頭編寫這個映射函數。