当在一对上使用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)
答案 0 :(得分:2)
因为snd
函数的类型是这样的:
snd :: (a, b) -> b
它只适用于元组。 (单对元素。)
如果你想要这样的东西在三元组上工作,你必须自己创建:
extractThird :: (a, b, c) -> c
extractThird (_, _, a) = a
答案 1 :(得分:2)
除了kqr提到的lens
之外,还有一个稍微简单的包tuple
,它具有大量不同大小的元组的实用函数。例如,模块Data.Tuple.Select
的sel1
和sel2
对应fst
和snd
,但适用于2-15个元素元组。
> sel2 (1,2,3)
2
> sel2 (1,2)
2
> sel2 ("a", "b", "c", "d", "e)
"b"
答案 2 :(得分:1)
是的,fst
和snd
仅为配对定义。
λ: :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提供了非常强大的功能,用于对等数据结构(包括元组),从中挑选值或修改它们。