模式匹配是非详尽的
Pattern match(es) are non-exhaustive
我正在尝试创建一个函数,从整数列表中消除给定整数的倍数,形式为 multiples x [y]
,其中 x 是给定整数,y 是列表。
这是我的:
multiples :: Integer -> [Integer] -> [Integer]
multiples a [] = []
multiples a [b] = filter (\l -> l `mod` a /= 0) [b]
multiples
调用时会失败,显示 "Non-exhaustive patterns in function multiples"。所以我在我的文件中使用 ghci -Wall
来查看丢失了哪些模式,它 returns this:
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 行中遗漏了一些非常简单的东西,但我有点卡住了。我做错了什么?
你的模式
multiples a [b]
需要一个整数(绑定到名称 "a")和包含一个元素的整数列表(绑定到名称 "b")。在此模式中删除方括号(这会将 "b" 的类型更改为 [Integer]),它应该可以工作。你也可以柯里化这个函数来形成
multiples a = filter (\l -> l `mod` a /= 0)
并省略第一个模式,因为它应该被过滤函数覆盖。
欢迎来到 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 x [y]
,其中 x 是给定整数,y 是列表。
这是我的:
multiples :: Integer -> [Integer] -> [Integer]
multiples a [] = []
multiples a [b] = filter (\l -> l `mod` a /= 0) [b]
multiples
调用时会失败,显示 "Non-exhaustive patterns in function multiples"。所以我在我的文件中使用 ghci -Wall
来查看丢失了哪些模式,它 returns this:
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 行中遗漏了一些非常简单的东西,但我有点卡住了。我做错了什么?
你的模式
multiples a [b]
需要一个整数(绑定到名称 "a")和包含一个元素的整数列表(绑定到名称 "b")。在此模式中删除方括号(这会将 "b" 的类型更改为 [Integer]),它应该可以工作。你也可以柯里化这个函数来形成
multiples a = filter (\l -> l `mod` a /= 0)
并省略第一个模式,因为它应该被过滤函数覆盖。
欢迎来到 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)