2013-12-20 3 views
1

При использовании функции SND на паре она отлично работает IESND функция с тройным

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) 

ответ

2

Поскольку тип snd функции, как это:

snd :: (a, b) -> b 

Он будет работать только на кортежей. (. элементы одной пары)

Если вы хотите что-то подобное, чтобы работать на тройках, вы должны создать свой собственный:

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

спасибо за это :). – user3094936

1

Да, fst и snd только для пар.

λ: :t snd 
snd :: (a, b) -> b 
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" 

и так далее. Объектив обеспечивает очень мощные функции для вглядывания в структуры данных (включая кортежи) и выделения из них значений или их изменения.

2

В дополнение к lens, упомянутому kqr, есть несколько более простой пакет 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" 
Смежные вопросы