私は、ErikMeijerのChannel9WebキャストからHaskellを自分自身に教えようとしているC#の人です。zipとmodを使用してリストのすべての「n」要素をスキップするという興味深いパズルに出くわしました。
every :: Int -> [a] -> [a]
every _ [] = []
every n xs = [x | (x,i) <- zip xs [1..], i `mod` n == 0]
modの使用を避けることができれば、(非常に大きなリストやストリームの場合)より効率的かもしれないと思っていました。
iの値をnと単純に比較できるように、整数の繰り返しリストを怠惰に作成することを考えました。
repeatInts :: Int -> [Int]
呼び出しが無限repeatInts 3
に返されるように[1,2,3,1,2,3,1,2,3,1,2,3,..]
。
これを考えると、次のevery
ように再定義できます。
every :: Int -> [a] -> [a]
every _ [] = []
every n xs = [x | (x,i) <- zip xs (repeatInts n), i == n]
だから私の質問は:どのように実装しrepeatInts
ますか?