如何解决haskell,如何使用元组创建小型数据库
|| 这是我的问题,我需要使用2元组(即成对)列表来构建一个数据库,该数据库代表有关一个国家拥有县所属城市的信息。 例如,c1拥有c2,而c2拥有c3,而c3拥有c4,但是没有直接说明c1对c4的“间接”所有权(等)。 我需要编写一个函数'owns \',给定两个字符串,country将返回一个布尔值,指示第一个字符串是否拥有第二个布尔值(即使是间接的,如上述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
解决方法
owns parent child = parent == child || any (owns parent) [p | (p,c) <- lst,c == child]
您将想知道它是如何工作的。
首先,我们认识到这是一个递归问题。 c1拥有c2拥有c3拥有c4等。我们不知道这可以采取多少步骤。因此,我们需要一个基本案例和一个递归案例。
基本情况是parent == child
。如果这是对的,那么总体答案是对的。
现在,递归的情况。 any
接受一个函数和一个列表,如果列表的任何成员使该函数返回True,则返回True。
(我现在需要睡觉,如有需要,稍后会再说。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。