haskell, как сделать небольшую базу данных с помощью кортежа - PullRequest
0 голосов
/ 14 апреля 2011

вот мой вопрос, мне нужно создать базу данных, представляющую информацию об одной стране, владеющей городом, владеющим округом, используя список из двух кортежей (т.е. пар) например, c1 владеет c2, которому принадлежит c3, которому принадлежит c4, но где «косвенное» владение c4 c1 (и т. д.) прямо не указано. мне нужно написать функцию 'owns', которая, учитывая две страны именования строк, возвращает логическое значение, указывающее, принадлежит ли первый второму (даже косвенно, как в случае c1 и c4 выше). Вот мой код, и я знаю, что он не совсем правильный, я новичок в haskell .... поэтому, пожалуйста, помогите, пожалуйста ....

lst = [("uk","scotland"),("scotland","aberdeen"),("china","hongkong"),("hongkong","kulong")]
owns :: String-> String -> Bool
owns a b 
    | n = lookup a (fromList lst)
        |if b==n 
            return true
        |otherwise m = lookup n (fromlist lst)
            if b==m
            return true
    | otherwise = False

Я ожидаю, что результат будет примерно таким:

Main> owns "uk" "scotland"
True
Main> owns "uk" "aberdeen"
True
Main> owns "uk" "hongkong"
False

1 Ответ

1 голос
/ 14 апреля 2011
owns parent child = parent == child || any (owns parent) [p | (p, c) <- lst, c == child]

Вы хотите знать, как это работает.

Во-первых, мы признаем, что это вопрос рекурсии. c1 владеет c2 владеет c3 владеет c4 и т. д. Мы не знаем, сколько шагов это может сделать. Итак, нам нужен базовый случай и рекурсивный случай.

Базовый случай parent == child. Если это правда, то общий ответ - правда.

Теперь рекурсивный случай. any принимает функцию и список и возвращает True, если какой-либо элемент списка возвращает функцию True.

(Мне нужно спать сейчас, я вернусь к этому позже, если потребуется.)

...