我将如何从Haskell列表中删除某些内容

时间:2019-02-15 22:58:09

标签: haskell

我想做一个函数,给定一个人的名字,删除该名字的电话簿中的所有条目。

 type Name = String
 type PhoneNumber = Int
 type Person  = (Name, PhoneNumber)
type PhoneBook = [Person]
delete::Name -> PhoneBook -> PhoneBook 

如何处理 我会用滴 我一直在使用它,但是却出现错误

  delete  :: Name -> PhoneBook -> PhoneBook
 delete name = (drop name xs) 

1 个答案:

答案 0 :(得分:0)

问题

首先,如果您试图从Haskell的列表中删除一个特定的元素,通常会做错事。有更好的类型可以做到这一点,从这种情况下的Data.Map到许多其他类型的Data.Ord

但是,如果您想按照自己的方式做,drop并不是它的功能。如果查看其类型drop :: Int -> [a] -> [a],您会发现它只会删除前n个元素。

解决方案

但是,您可以使用高阶函数filter :: (a -> Bool) -> [a] -> [a],该函数可以实现其功能。只需为其提供过滤所需内容的功能即可。您可以将lambda函数与简单的模式匹配配合使用:

deletePerson :: Name -> [PhoneBook] -> [PhoneBook]
deletePerson na = filter (\(n, p) -> name /= n)

还要注意,deleteData.List中的一个函数,它删除列表中第一次出现的东西