Извлечение кортежа из списка кортежей с помощью haskell - PullRequest
2 голосов
/ 07 февраля 2012

У меня есть этот производный тип данных AcInfo, который состоит из следующих пользовательских типов данных [(AcNo, Name, City, Amnt)] (все строки, кроме Amnt, который является Int), я хочу получить кортеж из следующего списка, проверив AcNo.

Я сделал заявление и немного дальше, но мне трудно понять, что делать дальше. Декларация:

accountDetails :: AcInfo -> AcNo -> [Name, City, Amnt]
accountDetails dbase number 

Будет ли полезно использование списочного понимания? Кроме того, что было бы хорошим способом найти решение?

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 07 февраля 2012

Вы можете сделать это с помощью списочных представлений довольно легко:

locateAcct :: AcNo -> [(AcNo, Name, City, Amnt)] -> (AcNo, Name, City, Amnt)
locateAcct account db = head [ tup | tup@(ac, _, _, _) <- db, ac == account ]

Конечно, используя head, мы открываем себя для возможности неудачного совпадения.Возможно, лучше было бы использовать что-то вроде безопасной библиотеки версии headMay, которая ничего не возвращает, если список пуст:

locateAcct :: AcNo -> [(AcNo, Name, City, Amnt)] -> Maybe (AcNo, Name, City, Amnt)
locateAcct account db = headMay [ tup | tup@(ac, _, _, _) <- db, ac == account ]

Теперь, если эта учетная запись несуществует, вы получаете Ничто вместо ошибки сопоставления с образцом.

1 голос
/ 07 февраля 2012

find ((==) target . fst4): http://zvon.org/other/haskell/Outputlist/find_f.html

, где fst4 - версия fst, которая принимает 4 кортежа. Не уверен, что он есть в библиотеке, но его легко написать.

...