gpt4 book ai didi

haskell - 如何使用 Lens 拍摄 2D 切片

转载 作者:行者123 更新时间:2023-12-02 16:56:20 27 4
gpt4 key购买 nike

import qualified Data.Vector as V
import Control.Lens
import Data.Vector.Lens

v = V.fromList [V.fromList [1..3], V.fromList [4..6], V.fromList [7..9]]

一维切片(例如):

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

2D slice:我应该写什么才能得到这个结果?

*Main> v ^. sliced 1 2 {- ??????? -}  sliced 0 2   --  Or not so?
V.fromList [V.fromList [4,5], V.fromList [7,8]]

最佳答案

这样就可以了

insliced :: Int -> Int -> Lens' (V.Vector (V.Vector a)) (V.Vector (V.Vector a))
insliced i n f m = f (V.map (V.slice i n) m)
<&> V.zipWith (\a b -> a V.// zip [i..i+n-1] (V.toList b)) m

然后

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

这与 sliced 的有效要求类似。

值得一提的是,有一个通用版本,称为线性中的column。它不能与 Vector 一起使用,因为 Vector 不是可表示(因为它的大小不是静态已知的)。但对于像 V3 这样的东西:

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

您可以为向量编写自己的(不太安全)版本:

vcolumn :: ALens' a b -> Lens' (V.Vector a) (V.Vector b)
vcolumn l f m = f (V.map (^# l) m) <&> V.zipWith (\a b -> a & l #~ b) m

关于haskell - 如何使用 Lens 拍摄 2D 切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29863379/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com