Haskell-递归检查关联列表的元素
Haskell- recursively check elements of associative list
假设我有以下关联列表:
names = [(6548712, "Charlie Brown"), (27378912, "Linux Van Pelt"), (5831457, "Peppermint Patty")]
我想检查给定的元组,例如...
(6548712, "Charlie Brown")
...存在于关联列表中。
这是我的函数:
check :: (String,a) -> [(String,a)] -> Bool
check val (x:xs)
| x == val = True
| otherwise = check val xs
该功能不起作用。我认为错误出在我的第一个守卫身上,因为我相信我的递归调用是正确的。我希望能够使用递归来完成此操作,有人可以帮助我吗?
您的数据包含数字和字符串,但您的函数读取的是字符串和数字。所以必须改成这个
check :: (Int, String) -> [(Int, String)] -> Bool
你的递归应该有一个基本条件,像这样
check val [] = False
表示如果列表为空(所有元素都勾选),return False
.
所以你的函数应该是这样的
check :: (Int, String) -> [(Int, String)] -> Bool
check val [] = False
check val (x:xs)
| x == val = True
| otherwise = check val xs
实际上,您可以通过以下方式使您的函数多态
check :: Eq a => (a, String) -> [(a, String)] -> Bool
要了解有关 Eq a
的更多信息,请查看 this excellent answer
为了完成,你可以随时使用elem
函数,像这样
Prelude> elem (6548712, "Charlie Brown") [(6548712, "Charlie Brown"), (27378912, "Linux Van Pelt"), (5831457, "Peppermint Patty")]
True
假设我有以下关联列表:
names = [(6548712, "Charlie Brown"), (27378912, "Linux Van Pelt"), (5831457, "Peppermint Patty")]
我想检查给定的元组,例如...
(6548712, "Charlie Brown")
...存在于关联列表中。
这是我的函数:
check :: (String,a) -> [(String,a)] -> Bool
check val (x:xs)
| x == val = True
| otherwise = check val xs
该功能不起作用。我认为错误出在我的第一个守卫身上,因为我相信我的递归调用是正确的。我希望能够使用递归来完成此操作,有人可以帮助我吗?
您的数据包含数字和字符串,但您的函数读取的是字符串和数字。所以必须改成这个
check :: (Int, String) -> [(Int, String)] -> Bool
你的递归应该有一个基本条件,像这样
check val [] = False
表示如果列表为空(所有元素都勾选),return
False
.
所以你的函数应该是这样的
check :: (Int, String) -> [(Int, String)] -> Bool
check val [] = False
check val (x:xs)
| x == val = True
| otherwise = check val xs
实际上,您可以通过以下方式使您的函数多态
check :: Eq a => (a, String) -> [(a, String)] -> Bool
要了解有关 Eq a
的更多信息,请查看 this excellent answer
为了完成,你可以随时使用elem
函数,像这样
Prelude> elem (6548712, "Charlie Brown") [(6548712, "Charlie Brown"), (27378912, "Linux Van Pelt"), (5831457, "Peppermint Patty")]
True