我知道有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元组。很快将它们推广到其他领域和操作就变得很痛苦。例如,如果您还想映射到元组的第一个元素,则必须引入另一个组合器(据记录,该组合器以Control.Arrow.first的形式存在于2个元组中)。这很快导致用于高Arue元组的组合器数量激增。

话虽如此,lens提供了一些不错的工具来处理元组。 Control.Lens.Tuple 提供了几个索引透镜_1_2等,它们允许访问直到arity 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 package提供了一些更通用的镜头,可以一次检查多个元组条目。

关于haskell - 为什么Haskell中没有元组的 "general"访问器函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15356953/

10-12 03:58
查看更多