1

私が機能を持っていると言う

foo n = foo' 1 where
    foo' n = foo' 1
    foo' x = x : foo' (x + 1)

例として、n = 5とすると、foo'nの意味をfoo'5にすることは可能ですか?したがって、ループします。

4

2 に答える 2

4

私はあなたが求めているのはこれだと思います:

foo n = foo' 1 
  where
    foo' x | x == n = foo' 1
    foo' x = x : foo' (x + 1)

パーツは| x == nパターンマッチガードコンディションです。

于 2013-03-19T06:13:37.120 に答える
1

Data.List の関数を使用してこれを行う簡単な方法があるようです

:m + Data.List
let mkList to count = (concat . replicate count) [1..to]
mkList 5 9
[1,2,3,4,5,1,2,3,4,5,1,2 ,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2 ,3,4,5,1,2,3,4,5]
mkList 1 10
[1,1,1,1,1,1,1,1,1,1]

レプリケートの代わりに、テイクサイクルを使用することもできます

let mkList to count = take count $ cycle [1..to]

take と cycle は、戻ってリストを連結する必要がないため、コストが低くなります。

または、反復を使用することもできます

((take 10 $ iterate (+1) 0) == [0..9]) == True
于 2013-03-19T06:52:58.407 に答える