【发布时间】:2014-09-18 22:34:13
【问题描述】:
我遇到了一个硬件问题。
编写一个构造集合的递归函数
mkSet :: Eq a => [a] −> Set a
给出的提示之一是我应该使用另一个名为isElement 的函数来检查每个值是否存在重复项。这是我为isElement 提供的内容
isElement :: Eq a => a -> [a] -> Bool
isElement x [] = False
isElement x (y:xs) = if x == y then True else isElement x xs
我经常遇到的一个主要错误是,每次我调用 isElement 时,mkSet 的值都会返回为 Bool(我不确定我是怎么做的)。
这就是我目前的 mkSet 所拥有的(同时请记住,我刚刚开始学习 Haskell)
mkSet :: Eq a => [a] -> Set a
mkSet x [] = isElement x (xs)
我应该做什么?
谢谢!
【问题讨论】:
-
Set是如何定义的?您是使用来自Data.Set的那个(通过import Data.Set)还是代码中某处有data Set a = ...? -
尝试定义一个
insert类型的Eq a => a -> Set a -> Set a函数;它将使用isElement来决定要做什么。然后看看能不能用insert来定义mkSet。 -
我想
Set a只是列表[a]的同义词(即您在文件中的某处有type Set = [];调用它只是表示该列表不应包含重复项),但如果你把这样的细节说清楚会有所帮助。 -
请注意,
if x == y then True else isElement x xs更简洁地写成x == y || isElement x xs。如果递归实现isElement不是问题要求的一部分,它可以写成isElement x xs = any (== x) xs,甚至写成isElement = elem:该函数已经存在于Prelude中。 -
这不是错误,但
x 'isElement' [] = ...看起来更好一些。对于mkSet- 您应该列出一个列表并在列表中保持唯一性