我正在编写一个函数 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未显示在输出中。
有谁能够帮助我?
您在参数中使用 (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的输入列表y并ys传递给拉姆达的参数。
| 归档时间: |
|
| 查看次数: |
1894 次 |
| 最近记录: |