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 vector
s 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
Post a Comment