2012-07-03 32 views
14

Tôi đang cố gắng bẻ khóa & làm việc với Mũi tên và đang gặp một số khó khăn. Tôi có một bối cảnh mà tôi cần một Arrow [a] [b] và tôi muốn viết một Arrow a b và ánh xạ/sắp xếp nó bên trong mũi tên, a la mapM. Cụ thể, mũi tên là Hakyll Compiler, nhưng tôi không nghĩ rằng đó là vấn đề quan trọng đối với câu trả lời.Mũi tên tương đương với mapM?

Với một mũi tên

myInnerArrow :: Arrow a => a b c 

Làm thế nào tôi có thể nâng này vào một mũi tên

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

?

Tôi đã xóa bỏ thư viện cơ sở, đặc biệt là trong Data.ListControl.Arrow, nhưng tôi không thể tìm thấy bất kỳ thứ gì có vẻ như nó sẽ thực hiện công việc. Liệu nó có tồn tại dưới cái tên tôi không mong đợi? Nó được cung cấp bởi một số thư viện khác? Không thể viết vì một lý do nào đó?

+0

Theo dõi: Hakyll có chức năng 'mapCompiler'. –

Trả lời

14

Bạn không thể không có sự lựa chọn. Chức năng nâng sẽ có loại này:

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

Cách dễ nhất để thực hiện là sử dụng proc ký hiệu:

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

đang chưa được kiểm tra, nhưng nên làm việc. Tuy nhiên, lưu ý rằng một hàm chung chung sẽ rất chậm. Tôi khuyên bạn nên viết hàm ánh xạ này cho mũi tên của bạn một cách cụ thể.