而在循环中返回(Haskell)

时间:2015-10-13 18:36:33

标签: loops haskell for-loop while-loop

如何在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)..],列表中每个元素都是由ijk组成的元组。 (如果它的形式为[[0,0,0],[0,0,1]...]而不是元组,那就没问题了。)

2 个答案:

答案 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的结果