Haskell - 复制列表中的元素

时间:2014-11-26 15:19:38

标签: haskell

我想编写一个Haskell程序,它可以复制给定次数的列表元素。 这是我的代码:

repli :: [a] -> a -> [a]
repli xs n = foldl1 (\x -> take n (repeat x)) xs

我的问题是编译时遇到以下错误:

  

'采取'适用于太多的参数

     

无法匹配预期类型' [a] - > [a]'实际类型' [[a]]'

5 个答案:

答案 0 :(得分:7)

foldl1的类型签名是:

foldl1 :: (a -> a -> a) -> [a] -> a

因此,第一个参数需要是两个参数的函数。您传递的lambda表达式只接受一个参数。你可能想做这样的事情:

repli :: [a] -> Int -> [a]
repli xs n = concat $ map (\x -> take n (repeat x)) xs

或者,为了做得更好,您可以使用replicate功能:

repli :: [a] -> Int -> [a]
repli xs n = concat $ map (replicate n) xs

或者,要做得更好,你可以使用[] monad:

repli :: [a] -> Int -> [a]
repli xs n = xs >>= replicate n

答案 1 :(得分:3)

这条非常简单的路线怎么样:

repli ::  [a] -> Int -> [a]
repli xs n = concat (replicate n xs)

答案 2 :(得分:0)

在推出自己的功能之前考虑Prelude replicatehttp://zvon.org/other/haskell/Outputprelude/replicate_f.html

repli xs n = foldr (++) [] (replicate n xs)

答案 3 :(得分:0)

您可以使用“ take”和“ repeat”。您还需要提供一个列表为空的基本情况。

repli [] _ = []
repli (x:xs) y = take y (repeat x) ++ repli xs y 

答案 4 :(得分:0)

一个对我有用的简单解决方案

f :: Int -> [Int] -> [Int]
f n arr = concatMap (\num -> replicate n num) arr