如何在Haskell中优雅地编写以下伪代码?
for (i from 0 to 100):
for (j from 0 to 100):
k=0
while ( f(i,j,k) >0 ):
return (i,j,k)
k+=1
其中f
是i
,j
和k
的不重要功能。
因此它应该输出如下内容:[(0,0,0),(0,0,1)..]
,列表中每个元素都是由i
,j
和k
组成的元组。 (如果它的形式为[[0,0,0],[0,0,1]...]
而不是元组,那就没问题了。)
答案 0 :(得分:3)
假设使用return
,你实际上是指类似Python的yield
,否则算法就没有意义了。
使用do
表示法,这非常简单:
do
i <- [0..100]
j <- [0..100]
k <- takeWhile (\k -> f i j k > 0) [0..]
return (i, j, k)
答案 1 :(得分:2)
未测试:
[ (i,j,k) |
i <- [0 .. 100],
j <- [0 .. 100],
k <- takeWhile (\k -> f i j k > 0) [0 ..] ]
这是一种列表理解,以明显的方式循环遍历i
/ j
,并使用takeWhile
来限制k
f
的结果