我想编写一个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]]'
类型签名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)