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

东方花花公子

我最近开始在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

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

请帮我解决这个问题。对执行第一个功能或其中任何一个的任何帮助都将非常好。谢谢。

埃里克·卡普伦

在这里,我仅对您提出的问题之一提供一般性答案。我希望这可以帮助您更好地理解一般问题,并针对您的特定问题/任务提出解决方案。

用命令式语言,我将创建一个计数器变量(例如i),然后使用系统功能tail删除列表的第一个元素,直到i = n。但是,正如我了解到的那样,在函数中只能执行常量操作,我想不出一种方法来决定何时停止重复执行并返回元素,而不是重新调用tail函数直到列表为空。

您始终可以使用状态变量“模拟” for循环,并使用递归打破循环:

Python:

def foo(xs):
    state = initial_state
    for x in xs:
        state = make_new_state(x, state)
        if not condition(state, x):
            break
    return state

在等效的Haskell代码中,您将使用内部函数以及该状态的额外参数。您还可以在上公开额外的参数,foo但通常您不想将其公开给的调用者foo

foo xs = go initialState xs
  where go []     state = state
        go (x:xs) state = if not (condition state x)
                          then state
                          else go xs (makeNewState x state)

对于许多算法,根本不需要中断循环,在这种情况下,“模式”变为:

foo xs = go initialState xs
  where go []     state = state
        go (x:xs) state = go xs (makeNewState x state)

makeNewState您在每个步骤执行的逻辑在哪里(当然,不必在单独的函数中执行)。

对于后一种情况,有一些通用函数foldrfoldlfoldl',例如:

foo xs = foldr makeNewState initialState xs

此外:还有诸如State monad之类的东西,它可以让您以纯粹的方式编写命令式逻辑,但是最好先理解诸如“原始”递归和折叠之类的东西,然后才继续学习诸如monads和显式状态之类的东西。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Racket,编写查找列表中第 n 个元素的函数

来自分类Dev

如何使用递归返回单链接列表中的第n个元素?

来自分类Dev

如何在Haskell元组中访问第n个元素

来自分类Dev

如何在Haskell元组中访问第n个元素

来自分类Dev

如何在Scala中将第n个和第(n + 1)个元素折叠到新列表中?

来自分类Dev

如何在SQL函数CHARINDEX中使用RegEx查找第n次出现

来自分类Dev

如何使用递归函数创建具有n个元素的列表置换列表?| Python

来自分类Dev

通过模式匹配在Scala中递归查找列表的第n个元素

来自分类Dev

使用递归在Python列表中查找第K个最大元素

来自分类Dev

如何在Prolog中找到列表的第N个元素

来自分类Dev

如何在 Prolog 中使用 append/3 查找列表的最后 2 个元素

来自分类Dev

如何使用 foldl 删除列表的第 n 个元素?

来自分类Dev

在Haskell中使用递归查找列表中的事件

来自分类Dev

使用递归查找列表的第一个和最后一个元素

来自分类Dev

如何在cypress中使用first()和last()函数单击下一个元素?

来自分类Dev

使用foldr查找列表的第K个元素

来自分类Dev

如何使用python列表理解更改列表列表中的第n个元素?

来自分类Dev

Rust-如何在集合中查找第n个最频繁的元素

来自分类Dev

如何在C ++中找到向量的第m个和第n个元素之间的max元素?

来自分类Dev

如何在Python中使用递归在列表中查找序列分割

来自分类Dev

将函数应用于列表的第n个元素

来自分类Dev

如何在Haskell中查找和/或删除元组列表中的元素

来自分类Dev

在Haskell中,最常见的将函数应用于列表的第N个元素的方法是什么?

来自分类Dev

如何在 Haskell 中使用零个或一个元素从 Set 中提取元素?

来自分类Dev

列表的第n个元素

来自分类Dev

pandas-使用字典映射dataframe元素-如何访问值列表的第n个元素

来自分类Dev

如何使列表中的第n个元素成为自己的列表?

来自分类Dev

Haskell中列表的第K个元素

来自分类Dev

使用Selenium Webdriver按类查找第n个元素

Related 相关文章

  1. 1

    Racket,编写查找列表中第 n 个元素的函数

  2. 2

    如何使用递归返回单链接列表中的第n个元素?

  3. 3

    如何在Haskell元组中访问第n个元素

  4. 4

    如何在Haskell元组中访问第n个元素

  5. 5

    如何在Scala中将第n个和第(n + 1)个元素折叠到新列表中?

  6. 6

    如何在SQL函数CHARINDEX中使用RegEx查找第n次出现

  7. 7

    如何使用递归函数创建具有n个元素的列表置换列表?| Python

  8. 8

    通过模式匹配在Scala中递归查找列表的第n个元素

  9. 9

    使用递归在Python列表中查找第K个最大元素

  10. 10

    如何在Prolog中找到列表的第N个元素

  11. 11

    如何在 Prolog 中使用 append/3 查找列表的最后 2 个元素

  12. 12

    如何使用 foldl 删除列表的第 n 个元素?

  13. 13

    在Haskell中使用递归查找列表中的事件

  14. 14

    使用递归查找列表的第一个和最后一个元素

  15. 15

    如何在cypress中使用first()和last()函数单击下一个元素?

  16. 16

    使用foldr查找列表的第K个元素

  17. 17

    如何使用python列表理解更改列表列表中的第n个元素?

  18. 18

    Rust-如何在集合中查找第n个最频繁的元素

  19. 19

    如何在C ++中找到向量的第m个和第n个元素之间的max元素?

  20. 20

    如何在Python中使用递归在列表中查找序列分割

  21. 21

    将函数应用于列表的第n个元素

  22. 22

    如何在Haskell中查找和/或删除元组列表中的元素

  23. 23

    在Haskell中,最常见的将函数应用于列表的第N个元素的方法是什么?

  24. 24

    如何在 Haskell 中使用零个或一个元素从 Set 中提取元素?

  25. 25

    列表的第n个元素

  26. 26

    pandas-使用字典映射dataframe元素-如何访问值列表的第n个元素

  27. 27

    如何使列表中的第n个元素成为自己的列表?

  28. 28

    Haskell中列表的第K个元素

  29. 29

    使用Selenium Webdriver按类查找第n个元素

热门标签

归档