【发布时间】:2017-03-28 10:26:53
【问题描述】:
正如标题所示,我正在尝试实现一个声明为的高阶函数
Ord u => [v->u]->[v]->[u]
具有输入 a) 任何类型的函数列表和任何类型的值范围和 b) 相同类型的元素列表,然后它将返回一个列表,该列表是所有发生的元素的结果从将给定列表中的函数应用到给定列表中的元素以升序排列,没有重复值。
我试图用 foldr 函数来实现它,但没有成功。 我认为我可以将 zip 函数作为一对索引,以便它们将与 foldr 函数一起应用。下面我创建了一个插入排序,因此我可以对最终列表进行排序
apply :: Ord u => [v->u]->[v]->[u]
apply f y = insSort (foldr(\(i, x) y -> x:y ) (zip [1..] f))
insSort :: Ord u => [u] -> [u]
insSort (h:t) = insert h (insSort t)
insSort [] = []
insert :: Ord u => u -> [u] -> [u]
insert n (h:t)
| n <= h = n : h : t
| otherwise = h : insert n t
insert n [] = [n]
例如一些输入和输出:
>apply [abs] [-1]
[1]
>apply [(^2)] [1..5]
[1,4,9,16,25]
>apply [(^0),(0^),(\x->div x x),(\x->mod x x)] [1..1000]
[0,1]
>apply [head.tail,last.init] ["abc","aaaa","cbbc","cbbca"]
"abc"
> apply [(^2),(^3),(^4),(2^)] [10]
[100,1000,1024,10000]
>apply [(*5)] (apply [(‘div‘5)] [1..100])
[0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100]
【问题讨论】:
-
你能展示你对 foldr 的尝试吗? :)
-
@user54264611634646244 当然,我只是编辑了它
标签: haskell