gpt4 book ai didi

haskell 镜头。获取最后一个之前的元素

转载 作者:行者123 更新时间:2023-12-04 07:30:14 27 4
gpt4 key购买 nike

有没有办法在最后一次使用 hakell 镜头之前获取元素?例如,我有这样一个结构:

pp = (1,2,3,4)
我想做类似 pp ^. _almostLast 的事情并获得 3 .我不能使用 _3 因为(假设)我不知道这个元组中有多少元素。

最佳答案

如果您希望您的代码灵活处理元组中元素的数量,一种选择是创建您自己的类型类,类似于 Field2 类(class)Control.Lens.Tuple ,它提供了 _2功能。
此类和前几个元组的实例 look like this (删除一些注释和不相关的代码后):

-- | Provides access to the 2nd field of a tuple.
class Field2 s t a b | s -> a, t -> b, s b -> t, t a -> s where
_2 :: Lens s t a b

instance Field2 (a,b) (a,b') b b' where
_2 k ~(a,b) = k b <&> \b' -> (a,b')
{-# INLINE _2 #-}

instance Field2 (a,b,c) (a,b',c) b b' where
_2 k ~(a,b,c) = k b <&> \b' -> (a,b',c)
{-# INLINE _2 #-}

instance Field2 (a,b,c,d) (a,b',c,d) b b' where
_2 k ~(a,b,c,d) = k b <&> \b' -> (a,b',c,d)
{-# INLINE _2 #-}
如果我们现在想要创建一个变体来选择倒数第二个元素,我们只需要调整代码即可:
 -- | Provides access to the 2nd to last field of a tuple.
class AlmostLast s t a b | s -> a, t -> b, s b -> t, t a -> s where
_almostLast :: Lens s t a b

instance AlmostLast (a,b) (a',b) a a' where
_almostLast k ~(a,b) = k a <&> \a' -> (a',b)
{-# INLINE _almostLast #-}

instance AlmostLast (a,b,c) (a,b',c) b b' where
_almostLast k ~(a,b,c) = k b <&> \b' -> (a,b',c)
{-# INLINE _almostLast #-}

instance AlmostLast (a,b,c,d) (a,b,c',d) c c' where
_almostLast k ~(a,b,c,d) = k c <&> \c' -> (a,b,c',d)
{-# INLINE _almostLast #-}
等等,对于你需要的尽可能多的元组。

但这里最大的问题是:你为什么不知道你的元组有多长?在大多数此类情况下,使用列表会更好,特别是这样您就不必为您希望遇到的每个可能长度的元组手动编写一堆实例。

关于 haskell 镜头。获取最后一个之前的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67978735/

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