【问题标题】:Define a remove function定义删除函数
【发布时间】:2011-03-31 13:09:02
【问题描述】:

我在做这个练习时遇到了问题,请帮忙!

定义一个函数remove,它接受一个整数和 一个整数列表作为输入并返回删除得到的列表 列表中第一次出现的整数;

delete :: Int -> [Int] -> [Int]

【问题讨论】:

  • 到目前为止你尝试过什么?如果我们知道您被困在哪里,我们会更容易提供帮助。

标签: list function haskell


【解决方案1】:

我正在学习 Haskell,所以我的回答并不权威。我没有发布我为回答您的问题而编写的代码,而是尝试按照我看待问题的方式编写代码。

我查看了各种案例(我发现这对 Haskell 有帮助):

  1. 从空列表中删除任何内容...这很容易

  2. 从非空列表 (ys) 中删除某些内容 (x):

    2.1。 x 是否等于ys 的第一个元素?那我就完了……

    2.2。否则我只需要从ys的第一个元素之后开始的列表中删除x

【讨论】:

  • 1.删除 n [] = 错误“空列表” 2. 删除 n y | n == y = [] |否则 = y 3. 删除 n (y:ys) | n==y= ys |
  • 1.删除 _ [] = [] 2. 删除 x (y:ys) | x == y =ys |否则 = y:(删除 x ys)
【解决方案2】:

将删除视为构建一个没有相关元素的新列表,而不是删除元素本身。 (听起来像家庭作业,所以我不会比这更具体:))

【讨论】:

  • 呃,难点在于它是列表中的第一个元素,并且可能会出现很多次。
  • 没问题。想想下面 MarcoS 描述的案例。如果列表的头部是要删除的元素,只需在列表的尾部使用delete即可。
【解决方案3】:

很抱歉给出答案,但这里是,直接来自the source of Data.List

delete :: (Eq a) => a -> [a] -> [a]
delete = deleteBy (==)

deleteBy :: (a -> a -> Bool) -> a -> [a] -> [a]
deleteBy _  _ []     = []
deleteBy eq x (y:ys) = if x `eq` y then ys else y : deleteBy eq x ys

通常我会在这里描述它,但如果您了解基本递归、if 语句、模式匹配、: 运算符和部分应用程序/currying,那么它应该是不言自明的。随意询问其中任何一项对您来说是否陌生。

【讨论】:

    【解决方案4】:

    首先:声明函数(查看函数声明的工作方式)- 取决于语言,它看起来类似于:

    array
    delete( int input1, array input2 )
    {
    }
    

    然后处理函数体

    声明你需要的变量, 执行数组操作 返回结果数组。

    【讨论】:

    • 问题在于 Haskell:函数很特殊,与通常的语言非常不同!
    猜你喜欢
    • 2014-02-17
    • 2021-12-16
    • 2015-08-15
    • 2011-10-12
    • 2022-11-08
    • 2019-07-15
    • 2014-05-25
    • 2018-08-07
    • 1970-01-01
    相关资源
    最近更新 更多