Haskell 三重存取元件
如果在Haskell中我有一个元组:Haskell 三重存取元件,haskell,Haskell,如果在Haskell中我有一个元组: x = (1, 2) 我可以使用fst x来检索1,使用snd x来检索2 我在想,如果我有三个: y = (1, 2, 3) 我可以使用类似的函数吗?您需要编写自己的提取器函数: extractFirst :: (a, b, c) -> a extractFirst (a,_,_) = a fst和snd函数仅适用于元组,即(a,b)没有内置元组。如果有,您将需要大量的1of2,2of2,1of4,4of7。与所有内置函数不同,fst和snd是
x = (1, 2)
我可以使用fst x来检索1,使用snd x来检索2
我在想,如果我有三个:
y = (1, 2, 3)
我可以使用类似的函数吗?您需要编写自己的提取器函数:
extractFirst :: (a, b, c) -> a
extractFirst (a,_,_) = a
fst
和snd
函数仅适用于元组,即(a,b)
没有内置元组。如果有,您将需要大量的1of2
,2of2
,1of4
,4of7
。与所有内置函数不同,fst
和snd
是专门定义的,对于大多数其他情况,我们使用模式匹配:
4of7 (_, _, _, x, _, _, _) = x
lens
库是一个相当流行的高级库,它通过使用巧妙的类型类提供了所有这些功能
3of4 = view _3
4of4 = view _4
3of7 = view _3
...
但是这种普遍性需要付出相当高的复杂性代价。正如前面提到的,要走的路是模式匹配。但是,为了完整性,我想提到的是,您可以简单地使用lambda函数:
head $ map (\(a, b, c) -> a) (y : [])
什么意义上的复杂性?使用这些特定的东西并不复杂,但它确实引入了许多依赖项,这可能会改变阴谋集团构建的计算复杂性类别。
view\u 3
的类型正是您所期望的,但超出了您的期望。你可以用n位的*来确定它,但实际上你并不比模式匹配和大量的依赖性好多少。