2015-10-13 141 views
0

如何在Haskell中优雅地编码下面的伪代码?while循环返回(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 

其中fijk不重要的功能。

所以它应该输出如下内容:[(0,0,0),(0,0,1)..],每个元素的列表由i,jk组成。 (如果它的形式是[[0,0,0],[0,0,1]...]而不是元组,它是好的。)

回答

2

未经测试:

[ (i,j,k) | 
    i <- [0 .. 100], 
    j <- [0 .. 100], 
    k <- takeWhile (\k -> f i j k > 0) [0 ..] ] 

这是一个列表理解的是,在明显的方式遍历i/j,并使用takeWhile限制kf的结果。

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)