我想做一个函数,给定一个人的名字,删除该名字的电话簿中的所有条目。
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)
答案 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)
还要注意,delete
是Data.List
中的一个函数,它删除列表中第一次出现的东西