我一直试图使用until来创建一个能够创建n个数字列表([1 ... n])的函数。到目前为止,我还没有找到任何示例,直到操纵列表并且我已经即兴创作:
sequence Int -> [Int]
sequence x = until (== x) (++ [ +1 ]) [1]
但是在表达式(意外令牌)错误中不断收到语法错误
我知道我可以简单地使用[1..n]来创建列表,但我真的想让它成功。提前感谢您的帮助。
答案 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]