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这显然是错误的,但我想我很接近..
所以任何帮助都会很好,谢谢!
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.
现在:想想你的表达必须做的"最外层".以下哪些功能适合这种形式?
你能将你的问题转化为具有这些形式之一和"内在"问题的外表达式吗?