Haskell - 复制列表中的元素

Dia*_*ana 1 haskell

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

repli :: [a] -> a -> [a]
repli xs n = foldl1 (\x -> take n (repeat x)) xs
Run Code Online (Sandbox Code Playgroud)

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

'take'适用于太多的参数

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

Mok*_*sha 7

类型签名foldl1是:

foldl1 :: (a -> a -> a) -> [a] -> a
Run Code Online (Sandbox Code Playgroud)

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

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

或者,为了更好地完成,您可以使用以下replicate功能:

repli :: [a] -> Int -> [a]
repli xs n = concat $ map (replicate n) xs
Run Code Online (Sandbox Code Playgroud)

或者,为了做到更好,你可以使用[]monad:

repli :: [a] -> Int -> [a]
repli xs n = xs >>= replicate n
Run Code Online (Sandbox Code Playgroud)

  • `concat $ map f xs`等同于恰当命名的`concatMap f xs`,所以你也可以减少它. (3认同)