Haskell编程简单函数递归

时间:2015-03-24 07:15:59

标签: function haskell recursion

对于该程序,将获取元素和列表,并返回新列表。如果列表中出现任何元素,则应在返回的列表中删除它们。

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

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

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

2 个答案:

答案 0 :(得分:4)

正如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)列表的模式已经将列表拆分为头{{1尾部x(这是Haskell中的常见模式)

答案 1 :(得分:2)

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

所以在你的情况下,你正试图获得head [a]。什么是[a]?你显然是指“具有类型[a]的函数的参数,但是不可能用Haskell代码编写。 (如果还有另一个相同类型的元素怎么办?)要使用一个参数,你必须在范围内_br,并使用一些任意名称(仅限名称不能包含括号),例如。

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