我有一个元组研究,我想用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
2条答案
按热度按时间ddarikpa1#
你的
let 2*x + y = 7
实际上是let (+) (2*x) y = 7
的缩写,所以你重新定义了(+)
函数,但是其中一个参数的模式是(2*x)
,这不是一个有效的模式,但是即使这样做有效,它也会产生整个 B×B 空间的元组,所以不是正确的答案。可以让
x
和y
枚举列表B
,并使用2*x + y == 7
进行过滤:但是执行成员资格检查可能稍微更有效:
两者都产生:
yyyllmsg2#
要在列表解析中应用过滤,您需要提供 predicate -
2*x + y == 7
:而不是您尝试使用的
let
声明。