在 Haskell 中使用 foldl 或 foldr 映射函数

Kus*_*nde 2 haskell

我正在编写一个函数 my_map,它接受一个一元函数和一个列表,并返回通过将函数映射到输入列表的所有元素而产生的列表。

Main> my_map (^3) [1..5]

[1,8,27,64,125]
Run Code Online (Sandbox Code Playgroud)

我是这样试的:

my_map :: (a -> b) -> [a] -> [b]
my_map f [] = []
my_map f (x:xs) = foldr (\x xs -> (f x):xs) [] xs
Run Code Online (Sandbox Code Playgroud)

但是在上面运行之后,我只得到[8,27,64,125]. 第一个数字1未显示在输出中。

有谁能够帮助我?

shr*_*t18 6

您在参数中使用 (x:xs) 模式,但是当您应用折叠时,您只将它应用到 xs 部分,这意味着您的第一个元素,即 x 代表的元素永远不会得到处理。你需要把它改成这样:

my_map :: (a -> b) -> [a] -> [b]
my_map f xs = foldr (\y ys -> (f y):ys) [] xs
Run Code Online (Sandbox Code Playgroud)

由于您使用的是foldr,您不需要显式处理空列表情况。此外,您不需要以 (x:xs) 格式指定列表。

最后,我自己的选择是避免使用相同的名称功能输入和definition.That是为什么,我已经使用了功能的辅助功能或表达式xs的输入列表yys传递给拉姆达的参数。

  • 为什么不直接定义`my_map f = foldr ((:) . f) []`? (2认同)
  • 如果你想变得毫无意义,那么试试 `flip foldr [] 。((:) .)`。 (2认同)