Haskell: как сравнивать кортежи? - PullRequest
1 голос
/ 13 апреля 2011

Я пытаюсь заставить список кортежей хранить некоторую информацию определенным образом.Например, scotland принадлежит uk, england принадлежит uk и т. Д. Затем возьмите две строки в качестве аргументов (String -> String -> Bool), чтобы создать что-то вроде:

Main> owns "china" "beijing"
True
Main> owns "uk" "beijing"
False

Вот мой код:

lst = [("uk","scotland"),("uk","england"),("uk","wales"),("china","beijing"),("china","hongkong"),("china","shanghai")]

owns :: String -> String -> Bool
owns a b = [n|(a,b) <- lst, (n == a)] && [m|(a,b) <- lst, (m==b]

Спасибо за помощь.

Ответы [ 3 ]

6 голосов
/ 14 апреля 2011

Если я правильно понял ваш вопрос, вы строите таблицу отношений. Затем вы получаете одно отношение и хотите проверить, находится ли оно в этой таблице? Просто используйте elem. elem a b возвращает true, если и только если a в b.

2 голосов
/ 14 апреля 2011

Найдите «списки ассоциаций» в библиотеке списков Haskell и функцию lookup:

Prelude> lookup "china" ls
Just "beijing"

, где lookup реализовано так:можно искать элемент по его ключу, затем вы можете сравнить его с ожидаемым значением.

0 голосов
/ 29 мая 2011

Вот определение для функции owns:

owns :: String -> String -> Bool
owns a b = (a,b) `elem` lst

Чтобы ответить на заголовок вашего вопроса, можно сравнить любые два кортежа одинаковой длины, если их элементы можно сравнить. Если вы знакомы с типами классов на данный момент,

(Eq a, Eq b) => Eq (a, b)
(Eq a, Eq b, Eq c) => Eq (a, b, c)
...
...