2015-10-13 176 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)