haskell - How to take an 2D slice with Lens -


import qualified data.vector v import control.lens import data.vector.lens  v = v.fromlist [v.fromlist [1..3], v.fromlist [4..6], v.fromlist [7..9]] 

1d slice (for example) :

*main> v ^. sliced 1 2 fromlist [fromlist [4,5,6],fromlist [7,8,9]] 

2d sclice: should write result?

*main> v ^. sliced 1 2 {- ??????? -}  sliced 0 2   --  or not so? v.fromlist [v.fromlist [4,5], v.fromlist [7,8]] 

this should it

insliced :: int -> int -> lens' (v.vector (v.vector a)) (v.vector (v.vector a)) insliced n f m = f (v.map (v.slice n) m)     <&> v.zipwith (\a b -> v.// zip [i..i+n-1] (v.tolist b)) m 

then

λ v ^. sliced 1 2 . insliced 0 2 fromlist [fromlist [4,5],fromlist [7,8]] 

this has similar requirements sliced valid.

it's worth mentioning there's general version of called column linear. can't used vector because vectors aren't representable (because because it's size isn't statically known). v3:

λ v3 (v3 1 2 3) (v3 4 5 6) (v3 7 8 9) ^. _yz . column _xy v2 (v2 4 5) (v2 7 8) 

you write own (less safe) version vectors:

vcolumn :: alens' b -> lens' (v.vector a) (v.vector b) vcolumn l f m = f (v.map (^# l) m) <&> v.zipwith (\a b -> & l #~ b) m 

Comments

Popular posts from this blog

shopping cart - Page redirect not working PHP -

php - How to modify a menu to show sub-menus -

python - Installing PyDev in eclipse is failed -