2014-10-22 3 views
0

Так у меня есть список кортежей, определенных как так:Получение элемента из списка кортежей в Haskell

type Domino = (Int,Int) 
data End = L|R 
type Board = [Domino] 
d :: Domino 
d= (4,5) 
b :: Board 
b= [(1,3),(3,3),(3,4)] 

В моей функции мне нужно, чтобы быть в состоянии получить первую часть доски. Так, например, я могу возглавить совет, чтобы получить домино (1,3) в качестве кортежа, но я пытался получить целое число от этого и просто терпеть неудачу. Мне нужно уметь сравнивать это целочисленное значение. Мой вопрос заключается в том, как вы получаете первую часть кортежа в списке, поскольку все, что я делал, и поиск продолжал терпеть неудачу. Извиняюсь, если это действительно просто, я новичок в haskell. Это мой код функции, очевидно, с кучей ошибок

goesP :: Domino->Board->End-> Bool 
goesP _ []_ = True 
goesP dom bor L = (if head bor fst == fst dom then True else if last bor == snd then True else False) 
+0

Каким-то образом. не совсем понятно, что вы хотите сделать. Первая часть пары может быть извлечена с помощью 'fst :: (a, b) -> a'. Сравнение не должно быть трудным. – Zeta

+0

'fst (1,3)' дает '1'. Используйте 'snd' для другого компонента. Альтернативно, «случай (1,3) of (x, y) -> useBoth x y'. При прочих равных условиях я бы рекомендовал сопоставление шаблонов перед проекциями 'fst/snd', и это часто приводит к более четкому коду. – chi

+0

Моя проблема заключается в том, что мне нужно получить кортеж из списка Board, а затем извлечь из него отдельный элемент. Поэтому я должен возглавить список, чтобы вернуть кортеж (1,3), а затем fst его, чтобы получить 1, но я пытаюсь сделать это все в одном разделе, если это имеет смысл. Я отредактирую приведенное выше с кодом для моей функции. – cjbatin

ответ

0

Из Вашего вопроса, он не выглядит, как вы заинтересованы в обобщенной функции, поэтому они будут работать:

fst $ head b получит самое первый Int в этом списке, и snd $ last b получит самое последнее ,

Как вы их сравниваете, зависит только от вас.

0

Как вы можете или не можете знать, FST и SND работают только для 2-элементных кортежей так что для вас это должно быть достаточно:

fst (a,b) = a 

вы также можете написать у вас есть:

get3th (_,_,a,_,_,_,_,_,_,_) = a 

Как вы можете видеть, вы можете определить свой собственный тип.

2

Что-то же просто, как

goesP :: Domino -> Board -> End -> Bool 
goesP _ [] _ = True 
goesP _ ((a,b):doms) _ = a 

будет работать, как вы можете шаблон матч для списка порожняком, а затем быть парой Cons остальные из списка, и извлечь первый элемент из этой пары ,

Я не уверен, что вы тоже пытаетесь сделать с типом End, но я оставил его там в моем примере (хотя я ничего не делаю с ним).

Смежные вопросы