我想编写一个Haskell程序,它可以复制给定次数的列表元素。 这是我的代码:
repli :: [a] -> a -> [a]
repli xs n = foldl1 (\x -> take n (repeat x)) xs
我的问题是编译时遇到以下错误:
'采取'适用于太多的参数
无法匹配预期类型' [a] - > [a]'实际类型' [[a]]'
答案 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 replicate
:http://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