Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Haskell当我到达列表中的最后一个元素时,如何重复列表中的元素?_List_Haskell - Fatal编程技术网

List Haskell当我到达列表中的最后一个元素时,如何重复列表中的元素?

List Haskell当我到达列表中的最后一个元素时,如何重复列表中的元素?,list,haskell,List,Haskell,我是Haskell编程的新手,我倾向于创建一个函数,可以在n次内重复列表中的每个元素,问题是当我到达列表中的最后一个元素时,我想返回到元素中的第一个元素,然后再次执行,如 repeat :: Int -> [t] ->[t] repeat 0 [] = [] repeat n (x:xs) | n > 0 = x : repeat (n-1) xs | n < 0 =[] 期望的结果是:1,2,3,1,2,3 如果要获取列表中的第一个元素并再

我是Haskell编程的新手,我倾向于创建一个函数,可以在n次内重复列表中的每个元素,问题是当我到达列表中的最后一个元素时,我想返回到元素中的第一个元素,然后再次执行,如

repeat :: Int -> [t] ->[t]
repeat 0 [] = []
repeat n (x:xs)
       | n > 0 = x : repeat (n-1) xs
       | n < 0 =[]
期望的结果是:1,2,3,1,2,3

如果要获取列表中的第一个元素并再次打印,我应该编辑什么?
谢谢

正如Mark Seemann所说,注释就像从列表循环中提取元素一样简单,所以

repeat :: Int -> [t] -> [t]
repeat n = take n . cycle
如果需要完全扩展的代码,大致如下所示:

repeat 6 [1,2,3] 
repeat :: Int -> [t] ->[t]
repeat 0 [] = []
repeat n (x:xs) | n > 0     = x : repeat (n-1) (xs ++ [x])
                | otherwise = []
其思想是,您消费的每一项都会附加到要处理的列表中。
这里有一个

,因为Mark Seemann的注释非常简单,只需从列表的循环中提取
n
元素,所以

repeat :: Int -> [t] -> [t]
repeat n = take n . cycle
如果需要完全扩展的代码,大致如下所示:

repeat 6 [1,2,3] 
repeat :: Int -> [t] ->[t]
repeat 0 [] = []
repeat n (x:xs) | n > 0     = x : repeat (n-1) (xs ++ [x])
                | otherwise = []
其思想是,您消费的每一项都会附加到要处理的列表中。
这里有一个

基本的替代方法是保留两个列表:其中一个通过模式匹配“消耗”,而另一个记住完整的列表,以便我们可以在需要时重新开始

-- requires n >= 0 and nonempty full
repeatAux :: Int -> [t] -> [t] ->[t]
repeatAux 0 _      _full = []
repeatAux n []     full  = repeatAux n full full
repeatAux n (x:xs) full  = x : repeatAux (n-1) xs full

repeat :: Int -> [t] ->[t]
repeat n _ | n <= 0 = []
repeat _ []   = error "repeat: empty list with n>0"
repeat n full = repeatAux n full full

一个基本的替代方法是保留两个列表:其中一个通过模式匹配“使用”,而另一个记住完整的列表,以便我们可以在需要时重新开始

-- requires n >= 0 and nonempty full
repeatAux :: Int -> [t] -> [t] ->[t]
repeatAux 0 _      _full = []
repeatAux n []     full  = repeatAux n full full
repeatAux n (x:xs) full  = x : repeatAux (n-1) xs full

repeat :: Int -> [t] ->[t]
repeat n _ | n <= 0 = []
repeat _ []   = error "repeat: empty list with n>0"
repeat n full = repeatAux n full full

让重复n=取n。循环
重复n=取n。那太酷了,谢谢你的解释。这真的很有帮助!将
xs++[x]
作为递归调用的第二个参数
repeate
对性能有什么影响?我认为添加到列表末尾会使函数的运行时间与列表中元素的数量成二次关系。(由于Haskell是懒惰的,我认为这将表现为要从列表中获取一个元素,必须计算N thunks(其中N是元素的数量)))。中的解决方案没有这个问题。@Lii,这是完全正确的,我只是简单地解释了主要思想,他们的方法是使用
repeat n=take n。循环
方法。那太酷了,谢谢你的解释。这真的很有帮助!将
xs++[x]
作为递归调用的第二个参数
repeate
对性能有什么影响?我认为添加到列表末尾会使函数的运行时间与列表中元素的数量成二次关系。(由于Haskell是懒惰的,我认为这将表现为要从列表中获取一个元素,必须计算N thunks(其中N是元素的数量)))。中的解决方案没有这个问题。@Lii,这是完全正确的,我只是简单地解释了主要思想,他们的方法是使用
repeat n=take n。循环
进近。