如何在haskell中使用递归函数来查找列表的第n个元素?和更多

Eas*_*ude 2 haskell functional-programming

我最近开始研究Haskell中的函数式编程,并给出了一些需要解决的问题,它要求使用递归和基本系统函数为列表创建自己的某些系统函数版本.我需要写的功能是:

  • !! (列表中的第n项)
  • append (一起加入名单)
  • subst(替代)例如subst 'x' 'y' ['q','x','r','x','s']〜>['q','y','r','x','y','s']
  • intersection 例如intersection [2,5,7] [9,7,3,5]〜>[5,7]
  • union 联盟例如 union [2,5,7] [9,7,3,5]〜>[2,5,7,9,3]
  • reverse 例如reverse [4,5,6,7]〜>[7,6,5,4]

我从第一个开始,写了这样的定义:

nthelement :: Eq a => [a] -> a -> a
Run Code Online (Sandbox Code Playgroud)

在命令式语言中,我会创建一个计数器变量(比如说i)并使用系统函数tail来删除列表的第一个元素,直到i = n.但是当我了解到在功能上你只能做常量时我无法想出一种方法来决定何时停止重复并返回元素而不是重新tail运行函数直到列表为空.

请帮我解决这个问题.做第一个功能或任何一个功能的任何帮助都会非常好.谢谢.

C. *_*ley 9

(正如@Bergi在评论中正确指出的那样,你应该检查你的签名和!!标准库中的签名是否重合!)

而不是将iin list !! i视为变量,将其视为函数参数.然后,考虑这个参数的不同情况,并决定你的!!函数在每种情况下应该做什么.然后,考虑列表参数list有哪些选项,以及如何考虑它们:

扩展所有潜在的选择ilist为我们提供以下内容:

nthelement :: [a] -> Integer -> a
nthelement [] 0 = -- ?
nthelement [] i = -- ?
nthelement (l:ls) 0 = -- ?
nthelement (l:ls) n = -- ?
Run Code Online (Sandbox Code Playgroud)

其余功能可以通过遵循类似的策略来编写.

  • +1用于识别相关基本案例,以及未提供完整解决方案:-) (2认同)