在给定元组条件下将2乘以x时,Haskell“模式中出现解析错误”

k4emjkb1  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(145)

我有一个元组研究,我想用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 compiler。我试过通过分隔x和y,或者通过改变括号和方括号来改变代码,但是我没有任何成功。有人对我有什么建议吗?提前感谢!
Haskell编译器中的代码:

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

main = do
print s
ddarikpa

ddarikpa1#

你的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)]
yyyllmsg

yyyllmsg2#

要在列表解析中应用过滤,您需要提供 predicate -2*x + y == 7

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

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

相关问题