模式匹配不是详尽的



我试图创建一个函数,从整数列表中消除给定整数的倍数,以multiples x [y]的形式,其中x是给定的整数,y是列表。

我有:

multiples :: Integer -> [Integer] -> [Integer]
multiples a [] = []
multiples a [b] = filter (l -> l `mod` a /= 0) [b]

multiples将在调用时失败,表示"函数倍数中的非穷举模式"。所以我使用ghci -Wall与我的文件来查看丢失的模式,它返回这个:

multiples.hs:2:1: warning: [-Wincomplete-patterns]
    Pattern match(es) are non-exhaustive
    In an equation for `multiples': Patterns not matched: _ (_:_:_)
multiples.hs:2:11: warning: [-Wunused-matches]
    Defined but not used: `a'

我觉得我在第2行遗漏了一些非常简单的东西,但是我有点卡住了。我做错了什么?

欢迎使用Stack Overflow!在您的函数中有几件事情需要修复,但我将从您似乎最困惑的那个开始:这里[b]是一个匹配单元素列表的模式,将其单个项目命名为b。([b, c]将是一个匹配双元素列表的模式,等等)它不是一个匹配任意长的b列表的模式。GHC告诉您,因为您没有考虑到函数已被给定两个或多个元素列表的情况。

如果要匹配任意的b列表,请省略方括号。此外,函数的第一行没有必要,因为第二行已经处理了这种情况。

multiples :: Integer -> [Integer] -> [Integer]
multiples a bs = filter (b -> b `mod` a /= 0) bs

或者,使用列表推导式

multiples :: Integer -> [Integer] -> [Integer]
multiples a bs = [b | b <- bs, b `mod` a /= 0]

还有两件事:我将这个函数命名为withoutMultiples,因为它过滤掉了a的倍数,并且因为Haskell函数是默认的,你可以在filter版本中省略bs

withoutMultiples :: Integer -> [Integer] -> [Integer]
withoutMultiples a = filter (b -> b `mod` a /= 0)

你的图案

    multiples a [b]

期望一个Integer(绑定到名称"a")和一个包含一个元素的Integer列表(绑定到名称"b")。在这种模式中删除方括号(这会将"b"的类型更改为[Integer]),它应该可以工作。你也可以将这个函数转换成

    multiples a = filter (l -> l `mod` a /= 0)

和省略第一个模式,因为它应该被过滤器函数覆盖。

相关内容

  • 没有找到相关文章

最新更新