【问题标题】:Write a recursive function that constructs a set编写一个构造集合的递归函数
【发布时间】: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 - 您应该列出一个列表并在列表中保持唯一性

标签: haskell recursion set


【解决方案1】:

首先,我认为您使用的是mkSet (x:xs) 而不是mkSet x [],因为您使用的是xs。

您的函数 'mkSet x [] = isElement x (xs)' 正在调用函数 isElement,该函数在他的位置返回 Bool。所以你分配给nkSet x []的是Bool而不是Set a

所以你想要的是这样的:

mkSet' :: [a] -> [a]
mkSet' [] = []
mkSet' (x:[]) = [x]
mkSet' (x:xs) = if (isElement x xs) then (mkSet' xs) else (x:(mkSet' xs))

此功能为您提供一个包含独特元素的列表。你唯一需要知道的就是把它变成一个集合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    相关资源
    最近更新 更多