繁体   English   中英

为什么Haskell中的元组没有“通用”访问器函数?

[英]Why are there no “general” accessor functions for tuples in Haskell?

我知道有fstsnd ,但是为什么使用类型类这样的访问器函数没有“通用”定义? 我会建议像

class Get1 p a | p -> a where
  get1 :: p -> a 

instance Get1 (a,b) a where
  get1 (x,_) = x 

instance Get1 (a,b,c) a where
  get1 (x,_,_) = x 

class Get2 p a | p -> a where
  get2 :: p -> a 

instance Get2 (a,b) b where
  get2 (_,x) = x 

instance Get2 (a,b,c) b where
  get2 (_,x,_) = x 

当然,你需要为这个有些语言扩展,但不是这个方便多了这样呢? 特别是您可以为自己的类型添加实例。

需要注意的一点是, fstsnd只允许一个人查看2元组。 将它们推广到其他智能和操作很快就会变得很痛苦。 例如,如果你想要映射元组的第一个元素,你必须引入另一个组合器(对于记录,它存在于2元组作为Control.Arrow.first )。 这很快导致高级元组的组合器数量激增。

话虽这么说, lens提供了一些很好的工具来处理元组。 Control.Lens.Tuple提供了几个索引镜头_1_2等,它们允许访问元组9的元组的第一个,第二个等元素。

例如,

>>> import Control.Lens
>>> let t = (1,2,3,5,6,7,2)
>>> t ^._1
1
>>> t & _1 .~ 'a'
('a',2,3,5,6,7,2)
>>> t & _1 +~ 41
(42,2,3,5,6,7,2)
>>> over _1 (+1) t
(2,2,3,5,6,7,2)

您可能还对Control.Lens.At中的元组实例感兴趣。 此外, tuple-lenses 提供了一些更通用的镜头,用于一次检查多个元组条目。

这样的类类只提供编码(语法)方便,我没有看到如何在它们上构建通用的元组类型工具。 如果您正在寻找元组泛化,请查看Reddit上有关异构向量的讨论

另请注意,对于普通结构,最好定义自己的ADT并为getter提供合理的名称,然后使用高元组。

编辑:但是,正如注释中指出的is7s一样,hackage上有许多包为任意长度的元组提供索引函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM