Haskell - 在列表中使用Until

时间:2016-10-12 18:15:11

标签: haskell

我一直试图使用until来创建一个能够创建n个数字列表([1 ... n])的函数。到目前为止,我还没有找到任何示例,直到操纵列表并且我已经即兴创作:

sequence Int -> [Int]
sequence x = until (== x) (++ [ +1 ]) [1]

但是在表达式(意外令牌)错误中不断收到语法错误

我知道我可以简单地使用[1..n]来创建列表,但我真的想让它成功。提前感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

记下until的类型:

until :: (a -> Bool) -> (a -> a) -> a -> a

对于您的情况,a[Int],因此所有内容都必须将列表作为输入并返回列表。

sequence x = until (\y -> last y == x) (\y -> y ++ [last y + 1]) [1]
  • 谓词采用一个列表并检查其最后一个元素是否等于x
  • 修饰符获取一个列表并在末尾添加一个新元素,该新元素比列表的最后一个元素大一个。

这不是很有效,因为您不断使用列表的错误结尾。您可以通过向后构建列表,然后在结束时将其反转来使其更高效。 (由于我们保证使用非空列表,为简单起见,我使用head代替模式匹配。)

sequence x = reverse $ until ((== x) . head) (\y -> (head y + 1) : y) [1] 

或将列表从x构建到1:

sequence x = until ((==1) . head) (\y -> head y-1 : y) [x]