Haskell:让语句在函数声明中使用先前声明的变量

时间:2013-03-19 05:41:40

标签: haskell

说我有功能

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

例如,假设n = 5 是否有可能使foo'的含义成为foo'5?所以它会循环。

2 个答案:

答案 0 :(得分:4)

我想你要求的是:

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

| x == n部分是模式匹配保护条件。

答案 1 :(得分:1)

使用Data.List

中的函数似乎有一种更简单的方法
  

:m + Data.List
  让mkList计数=(concat。复制计数)[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]

您也可以使用replicatetake

代替cycle
  

让mkList计数=取$ count [1..to]

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

或者您也可以使用iterate

((take 10 $ iterate (+1) 0) == [0..9]) == True