【问题标题】:Haskell Programming simple function recurrsionHaskell 编程简单函数递归
【发布时间】:2015-05-27 10:10:35
【问题描述】:

对于这个程序,一个元素和一个列表被引入并返回一个新列表。如果列表中出现任何元素,则应在返回的列表中将其删除。

allOcrDelete :: Eq a => a -> [a] -> [a]

allOcrDelete del = if head [a] == number then allOcrDelete(tail [a])
               else del ++ [head [a]] ++ allOcrDelete(tail [a])

这是我到目前为止所拥有的。我不确定如何将元素和列表作为参数以及如何获取头部或尾部并将头部与要删除的元素进行比较

【问题讨论】:

  • 作业对使用filter命令有什么限制吗?

标签: function haskell recursion


【解决方案1】:

首先让我说,永远不要使用 headtail。 ...嗯,至少在你积累了如此多的经验之后,你才能认识到它实际上使事情变得更简洁的少数情况。通常模式匹配(或折叠等)不仅更安全,而且更具可读性和直观性。

因此,在您的情况下,您正在尝试获取head [a][a] 是什么?您的意思显然是“函数的参数类型为[a],但这不可能用Haskell 代码编写。 (如果还有另一个相同类型的元素呢?)要使用一个参数,你必须 _bring 它在范围内,带有一些任意名称(只是,名称不能包含括号),例如

delete' del xs = if head xs == number then delete'(tail xs)
                  else del ++ [head xs] ++ delete'(tail xs)

会起作用的。 (有点。number 在那里也没有意义:您可能想与del 进行比较,而不是插入。)

但是,由于您对 xs 所做的唯一事情就是调用 evil headtail 函数,因此您应该这样写:

delete' del (x:xs) = if x == number then delete' xs
                      else del ++ [x] ++ delete' xs

【讨论】:

  • 我认为这可能需要另外几段来解释为什么number 在这种情况下没有意义,并澄清else 子句应该是什么样子(您还重命名了allOcrDelete到 LHS 上的 delete',但不在 RHS 上)。
【解决方案2】:

正如 jamshidh 提到的,你可以使用filter 并写:

allOcrDelete del = filter (/= del)

allOcrDeletefilter 的特例)

一个简单的实现可能是:

module Main where

allOcrDelete :: Eq a => a -> [a] -> [a]
allOcrDelete _ [] = []
allOcrDelete del (x:xs)
    | del == x  =   allOcrDelete del xs
    | otherwise = x:allOcrDelete del xs

main = do
    print $ allOcrDelete 2 [1,2,5,3,2,4,5,2]

注意:

  • 在这种情况下,您不需要使用 headtail 函数,因为将列表与 (x:xs) 匹配的模式已经将列表拆分为头部 x 和尾部 xs(这个是 Haskell 中的常见模式)

【讨论】:

  • filter 解决方案是最简洁明了的解决方案。请让它更突出:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-14
  • 2019-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-13
  • 1970-01-01
相关资源
最近更新 更多