任务是使用列表生成器找到可表示为两个自然数的根的总和的所有二值数,并打印所有这些组合+列表的长度。我明白了:
import Data.List
func = filter (>9) (takeWhile (<100) (nub [floor (sqrt (x) + sqrt (y)) | x <- [0..], y <- [0..]]))
l = length func
如何打印每个组合,而不仅仅是结果?
答案 0 :(得分:3)
我怀疑&#34;我如何打印每个组合?&#34;,你的意思是&#34;我如何获得给我的x
和y
值适当的总和?&#34;。最小的修复方法是让列表理解返回x
,y
和一次性总和,并修改您的filter
和dropWhile
以忽略{{1} }和x
位。因此:
y
您可能还会感兴趣nubBy
。然而,仍然有许多&#34; thinkos&#34;你应该一次解决一个问题:
func = id
. filter (\(x,y,sum) -> sum > 9)
. takeWhile (\(x,y,sum) -> sum < 100)
. nub
$ [(x,y,floor (sqrt (x) + sqrt (y))) | x <- [0..], y <- [0..]]
是一个坏名字;这个名字意味着它是一个函数,它不是真的。func
是否添加到整数;相反,你强迫他们的总和是一个整数。您的迭代策略绝不会选择除sqrt
以外的x
。您应该通过已知的最坏情况限制迭代的上限,例如:由
0
或应用another of my answers中描述的修补程序。
x <- [0..100^2], y <- [0..100^2]
策略将不正确。takeWhile
和x
值?)