你如何使用折叠图解决这个Haskell问题并采取?

Lin*_*hen -2 haskell higher-order-functions

定义一个函数复制,给定一个数字列表返回一个列表,每个数字都复制其值.使用折叠,地图和拍摄

..>复制[5,1,3,2,8,1,2]

产量:[5,5,5,5,5,1,3,3,3,2,2,8,8,8,8,8,8,8,8,1,2,2]

我已经使用List理解和递归来解决这个问题:

replicate2 [] = []
replicate2 (n:nn) = take n(repeat n) ++ replicate2 nn
Run Code Online (Sandbox Code Playgroud)

但是你如何使用折叠和地图来做到这一点?到目前为止我有:复制n = map(foldl1(取n(重复n))n)n这显然是错误的,但我想我很接近..

所以任何帮助都会很好,谢谢!

Mtn*_*ark 6

Haskell中的关键始终遵循以下类型:

foldr  :: (a -> b -> b) -> b -> [a] -> b
foldr1 :: (a -> a -> a)      -> [a] -> a
map    :: (a -> b)           -> [a] -> [b]
take   :: Int                -> [a] -> [a]
Run Code Online (Sandbox Code Playgroud)

我在这里添加了一些空格,以便更清楚地了解这三个函数的比较.记住,当你看到这些,一个类型的变量,a或者b,可以匹配任何类型的,包括像String,或者[Float],甚至[(String,[Int])].例如,在表达式中:

foldr (\a b -> product a + b) (0::Int) [[1,2,4],[5,2],[0,3,6]]
Run Code Online (Sandbox Code Playgroud)

foldr被用作类型([Int] -> Int -> Int) -> Int -> [[Int]] -> Int.这是a匹配[Int]b匹配Int.

现在:想想你的表达必须做的"最外层".以下哪些功能适合这种形式?

你能将你的问题转化为具有这些形式之一和"内在"问题的外表达式吗?