在给定元组条件下将 2 乘以 x 时 Haskell "parse error in pattern"



我有一个元组研究,我想用Haskell写出来。给出了s={〈x,y〉|2x+y=7,x∈B,y∈B},其中B={1,2..20}。我发现答案是S={〈1,5〉,〈2,3〉,〈3,1〉}。然而,当我在在线Haskell编译器中键入它时https://app.codingrooms.com/w/Yr2VJHj0yb9S,我要么得到太多元组,要么得到错误消息Snapshot,Haskell编译器。我试过通过分隔x和y,或者在括号和方括号之间交替来更改代码,但没有成功。有人给我什么建议吗?提前感谢!

Haskell编译器中的代码:

b = [1, 2.. 20]
s = [(x,y)|x <- b, y <- b, let 2*x + y = 7]
main = do
print s

您的let 2*x + y = 7实际上是let (+) (2*x) y = 7的缩写,因此您正在重新定义(+)函数。但是其中一个参数具有作为模式的(2*x),这不是有效的模式。但即使这样做有效,它也会为整个B×B空间生成元组,所以这不是正确的答案。

您可以让xy在列表B上枚举,并使用2*x + y == 7:进行筛选

f b = [ (x, y) | x <- b, y <- b, 2*x + y == 7 ]

但执行成员身份检查可能会稍微高效一些:

f b = [ (x, y) | x <- b, let y = 7 - 2*x, y `elem` b ]

两种产量:

ghci> f [1 .. 20]
[(1,5),(2,3),(3,1)]

要在列表理解中应用过滤,您需要提供谓词-2*x + y == 7:

s = [(x,y)|x <- b, y <- b, 2*x + y == 7]

而不是您尝试使用的let声明。

最新更新