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
让 mkList 计数 = (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]

除了复制,您还可以使用takecycle

让 mkList 计数 = 计数 $ 循环 [1..to]

take 和 cycle 会更便宜,因为您不必返回并连接列表。

或者你也可以使用迭代

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