是否可以编写一个简单的 map 函数,它允许在一个参数上具有多个函数?例如mapmultiple [square, pred] 4 --> [16, 3]
map1 :: (a -> b) -> [a] -> [b]
map1 f [] = []
map1 f (x:xs) = foldr (\y ys -> (f y):ys) [] xs
Run Code Online (Sandbox Code Playgroud)
map1 允许它使用一个函数,但是它如何使用两个或三个函数?
这只是map颠倒了论点。
map :: (a -> b) -> [a] -> [b]
mapmultiple :: [a -> b] -> a -> [b]
Run Code Online (Sandbox Code Playgroud)
的“函数”map将是一个应用参数的高阶函数。
mapmultiple fs x = map ($ x) fs
Run Code Online (Sandbox Code Playgroud)
如果您对该$部分不满意,这相当于[1]到
mapmultiple fs x = map (\f -> f x) fs
Run Code Online (Sandbox Code Playgroud)
[1]有一段时间,有一个 GHC 错误,其中部分会错误地编译为类似(但不完全等效)的代码。我不确定它是否已修复。它不应该在这里相关,但我想我应该提到它。