我有一个元组研究,我想用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空间生成元组,所以这不是正确的答案。
您可以让x
和y
在列表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
声明。