snd函数与三元组合

时间:2013-12-20 16:47:30

标签: haskell tuples

当在一对上使用snd函数时它工作正常,即

snd (1,2) ~> 2

但是它不能用于三元组。

snd (1,2,3) ~>

<interactive>:2:5:
Couldn't match expected type `(a0, b0)'
            with actual type `(t0, t1, t2)'
In the first argument of `snd', namely `(1, 2, 3)'
In the expression: snd (1, 2, 3)
In an equation for `it': it = snd (1, 2, 3)

4 个答案:

答案 0 :(得分:2)

因为snd函数的类型是这样的:

snd :: (a, b) -> b

它只适用于元组。 (单对元素。)

如果你想要这样的东西在三元组上工作,你必须自己创建:

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

答案 1 :(得分:2)

除了kqr提到的lens之外,还有一个稍微简单的包tuple,它具有大量不同大小的元组的实用函数。例如,模块Data.Tuple.Selectsel1sel2对应fstsnd,但适用于2-15个元素元组。

> sel2 (1,2,3)
2

> sel2 (1,2)
2

> sel2 ("a", "b", "c", "d", "e)
"b"

答案 2 :(得分:1)

是的,fstsnd仅为配对定义。

λ: :t snd
snd :: (a, b) -> b

答案 3 :(得分:0)

如果你想要一个更通用的函数从元组中提取元素,你可以用lens库做同样的事情。

λ> view _1 ("lens", "gives", "you", "general", "things")
"lens"
λ> view _2 ("lens", "gives", "you", "general", "things")
"gives"
λ> view _3 ("lens", "gives", "you", "general", "things")
"you"

等等。 Lens提供了非常强大的功能,用于对等数据结构(包括元组),从中挑选值或修改它们。