【问题标题】:Haskell - parse error/ using multiple where clausesHaskell - 解析错误/使用多个where子句
【发布时间】:2023-04-02 17:36:01
【问题描述】:

当试图定义一个函数时,该函数将从集合 a 中删除集合 m 的最大子集,该子集也是集合 a 的子集,我遇到了以下错误:

filename.hs:7:33:parse error (possibly incorrect indentation)

以下代码:

exclude :: Integral t => [t] -> [t] -> [t]
a `exclude` m
           | m == [] = a
           | a == (b ++ c) = b
           | otherwise = []
           where b /= []
           where c = [z | z <- m]

如何实现多个条件/定义(使用 where 或其他方式),或更正函数以以不同方式正常工作?

【问题讨论】:

  • where b /= []的意图是什么?
  • 预期结果是a 中不是m 元素的那些元素的列表吗?
  • 预期结果确实是 a 的所有元素都不是 m 的元素。顺便说一句,感谢丹尼尔对语法的帮助,即使它没有解决问题。
  • a 'exclude' m = filter (notElem m) a 有效。谢谢 joachifm/Christian

标签: list haskell set where-clause


【解决方案1】:

您的问题的一部分很容易回答。您可以在一个where 子句中有多个定义,如

foo n
    | even r = bar
    | s < 12 = baz
    | otherwise = quux
      where
        r = n `mod` 1357
        h = a + b
          where
            (a,b) = r `divMod` 53    -- nested where-clause
        s = r - 3*h

你可以嵌套where-clauses。但是在where-clause 中,您只能有定义。条件将进入守卫(或右侧的if then else 表达式),并且可以与布尔运算符组合,(&amp;&amp;)(||)not ...

至于你的代码,到目前为止我还没有弄清楚你打算做什么。

【讨论】:

    【解决方案2】:

    说“集合m 的最大子集也是集合a 的子集” 等同于说“m 的所有元素同时也是a 的元素”。

    那么你的问题的解决方法就简单的表述为:

    exclude a = filter (`notElem` a)
    

    当应用于 m 时,将为您提供 m 的子集,以任何元素为模 也是a 的成员。也就是说,它将“删除最大的子集 m 也是 a 的子集。

    【讨论】:

    • +1 用于切割所有内容,并以优雅、可读和易于理解的单行结束。
    • -1 不问问题。抱歉,我是来找where的。
    • @ziggystar,该问题要求“使用 where 或其他方式”的解决方案,甚至是“纠正功能以以不同方式正常工作”的解决方案。在我看来,joachifm 回答了这个问题,所以我不明白为什么要惩罚他们。
    【解决方案3】:

    其实Data.List和Data.Set中有一个函数叫做'\'。我将展示 Data.List 的 '\' 函数。

    import Data.List
    exclude :: Integral t => [t] -> [t] -> [t]
    a `exclude` m = a\\m
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-22
      相关资源
      最近更新 更多