2013-12-07 28 views
4

如果在Haskell我有一個元組:哈斯克爾三重訪問元素

x = (1, 2) 

我可以用FST X檢索1和SND X檢索2

我在想,如果我有三:

y = (1, 2, 3) 

有沒有類似的功能我可以使用?

感謝(:

回答

5

你需要編寫自己的提取功能:

extractFirst :: (a, b, c) -> a 
extractFirst (a,_,_) = a 

沒有內置的fstsnd功能只適用於一個元組即(a, b)

+0

AAAH好,謝謝:d – MrD

6

如果有的話,你需要一大堆1of2,2of2,1of4,4of7。而不是讓他們al l由於內置函數,fstsnd專門定義,對於其他大多數情況下,我們使用模式匹配:

4of7 (_, _, _, x, _, _, _) = x 

lens庫,一個相當流行的先進庫,並通過巧妙的類型類提供所有這些。

3of4 = view _3 
4of4 = view _4 
3of7 = view _3 
... 

但是,通用性的價格相當陡峭。

+0

複雜在什麼意義?使用這些特定的東西並不複雜,但它確實引入了很多依賴關係,這可能會改變cabal構建的計算複雜性類。 – dfeuer

+0

'view_3'的類型正是你所期望的,但超出了你的想象。你可以用'* ofN'位指出它,但是你實際上並不比模式匹配更好,並且還有很多依賴。 –

2

如前所述,要走的路是模式匹配。然而,爲了完整起見,我想提一提,你可以簡單地使用lambda功能:

head $ map (\(a, b, c) -> a) (y : [])