我知道有fst
和snd
,但是为什么对于使用类型类的此类访问器函数没有“通用”定义呢?我会建议类似
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
当然,您需要一些语言扩展,但是这样不是更方便吗?特别是,您可以为自己的类型添加实例。
最佳答案
需要注意的一件事是,fst
和snd
仅允许一个人查看一个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/