在Haskell中使用map和递归函数

Kel*_*reu -3 recursion haskell

所以我正在学习如何在Haskell中编程.

我希望看到的一件事是通过使用map并使用不使用列表推导而不使用map或任何其他高阶库函数的递归,为列表的每个元素添加1.

我认为看到两种实施方式都很酷.

Sat*_*vik 8

如果您了解了什么map,那么我认为编写您打算做的事情并不困难.当你看到的类型map

*Main> :t map
map :: (a -> b) -> [a] -> [b]
Run Code Online (Sandbox Code Playgroud)

因此它需要一个函数和一个列表,并在将该函数应用于列表的每个元素后返回另一个列表.因此,为了您的目的,为每个元素添加一个,您可以选择要执行的功能(+1).所以

*Main> map (+1) [3,4,5,1,2]
[4,5,6,2,3]
Run Code Online (Sandbox Code Playgroud)

如果您了解基本的haskell,现在定义自己的函数很容易.您可以查看map帮助来源.

map _ []     = []
map f (x:xs) = f x : map f xs
Run Code Online (Sandbox Code Playgroud)

它为您提供了实现递归递增函数所需的所有帮助

add' [] = []
add' (x:xs) = (x+1) : add' xs
Run Code Online (Sandbox Code Playgroud)

现在在ghci中尝试这个

*Main> add' [3,4,5,1,2]
[4,5,6,2,3]
Run Code Online (Sandbox Code Playgroud)