-1

这是我的问题,我需要使用 2 元组(即对)列表构建一个表示有关一个国家拥有县拥有城市的信息的数据库,例如 c1 拥有 c2,拥有 c3,拥有 c4,但是在哪里没有直接说明 c1(等)对 c4 的“间接”所有权。我需要编写一个函数'拥有',给定两个命名国家的字符串返回一个布尔值,指示第一个是否拥有第二个(甚至间接地,如上面的 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
4

1 回答 1

1
owns parent child = parent == child || any (owns parent) [p | (p, c) <- lst, c == child]

你会想知道这是如何工作的。

首先,我们认识到这是一个递归问题。c1 拥有 c2 拥有 c3 拥有 c4 等等。我们不知道这需要多少步骤。所以我们需要一个基本案例和一个递归案例。

基本情况是parent == child. 如果这是真的,那么总体答案是真的。

现在,递归案例。any接受一个函数和一个列表,如果列表的任何成员使函数返回 True,则返回 True。

(我现在需要睡觉,如果需要,稍后会回来。)

于 2011-04-13T22:47:02.413 回答