【问题标题】:Eq => function in HaskellHaskell 中的 Eq => 函数
【发布时间】:2019-08-29 23:59:33
【问题描述】:

我想弄清楚如何用 Haskell 中的 Eq 函数编写这个函数。

我尝试实现的一个简单功能是:

f :: Eq a => [a] -> [[a]]

其中 f 会将每个重复的连续元素聚集在单独的子列表下,例如:

f [3] = [[3]]
f [1,1,1,3,2,2,1,1,1,1] = [[1,1,1],[3],[2,2],[1,1,1,1]]

我想过这个功能:

f :: Eq a => [a] -> [[a]]
f [] = []
f (x:[]) = [[x]]
f (x:x':xs) = if x == x' then [[x, x']] ++ (f (xs))
                    else [[x]] ++ (bundler (xs))

它似乎不能很好地工作,因为当它到达最后一个元素时,它想将它与它的连续元素进行比较,这显然不存在。

此外,我觉得我没有使用 Eq => 函数。

我想收到一个答案,说明如何在我的情况下正确使用 Eq。

提前致谢。

【问题讨论】:

  • "我觉得我没有使用 Eq => 函数。"您正在使用==,它在Eq 类型类中定义。如果没有Eq 约束,则不能使用==。所以你正在正确使用Eq
  • 所以当我使用 Eq 时,它可以让我使用 ==,对于 + 和 - 等也一样?
  • +-Num 中定义。
  • 类型类是函数名称(及其类型)的集合。 Eq 类提供 == 函数名。类型类的实例是特定类型的那些命名函数的实现。因此,当您说Eq a => [a] 时,您所说的是“其元素类型具有定义的== 函数的列表”。当您说Num a => a 时,您所说的是“实现了+* 以及Num 的其他功能的类型。
  • 您的问题与Eq 类型类无关。您可以通过将其类型更改为使用实现Eq 的具体类型来看到这一点,例如f :: [Int] -> [[Int]]。你还是会遇到同样的问题,而且周围没有Eq

标签: haskell recursion


【解决方案1】:

Eq 类型类在您的类型中的存在是一个红鲱鱼:它与您报告的错误无关。发生您报告的错误是因为您已经定义了当列表为空 (f [] =) 和列表至少包含两个元素 (f (x:x':xs) =) 时函数的行为方式,但不是当列表只有一个元素时。解决方案是添加一个开始的案例*

f [x] = ????

并决定如何处理单元素列表。或者找到其他方法来编写处理所有情况的函数。


* 请注意f [x]f (x:[]) 相同。

【讨论】:

  • 我必须在上下文中查看新代码以及错误消息才能知道它为什么无法编译。但好消息是你现在有一个新问题要解决,那就是进步! (OP 报告说添加 f[x]=[[x]] 会出错。)
  • 谢谢,让我编辑我的问题,以便您查看当前代码
  • 请不要将问题编辑成不同的问题。这将使所有当前的工作变得无关紧要,并使以后可能会看到它的人感到困惑。请发布一个新问题。
  • 当然,我刚刚添加了一个新行,就是这样。问题保持不变。我还应该为此提出一个新问题吗?
  • 不,没关系。针对您的编辑,f x:[]f [x]f (x:[]) 不同,并且不会起作用。
【解决方案2】:

您还可以使用span 和递归调用来使其工作:

f :: Eq a => [a] -> [[a]]
f [] = []
f l@(x:xs) = grouped : f remainder
    where
        (grouped, remainder) = span (== x) l

这里有live example

【讨论】:

    猜你喜欢
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    • 2011-08-03
    • 2017-04-03
    • 1970-01-01
    相关资源
    最近更新 更多