[英]Tuples Pattern Matching list Haskell
我正在尝试实现一个函数,其中我有一个 2 元组列表,它返回与 True 对应的元组。 第一个字符是字符串,第二个字符是布尔值。 这就是我要的:
pack [ ("a", True), ("b", False), ("c", False), ("d", True) ]
returns [ ("a", True), ("d", True) ]
这是我的代码:
pack :: [String] -> [Bool] -> [(String, Bool)]
pack [] [] = []
pack (x:xs) [] = []
pack [] (y:ys) = []
pack (x:xs) (True:ys) = (x, True) : pack xs ys
pack (x:xs) (False:ys) = pack xs ys
我只能通过输入获得 { 返回 [("a", True), ("d", True)] }
pack ["a", "b", "c", "d"] [True, False, False, True]
这不是我想要的,我很困惑如何解决这个问题。 任何帮助、指导或链接将不胜感激。
我将使用对您尝试实施的内容的描述来向您展示我的解决方案步骤。 希望这可以帮助您在未来收敛于自己的解决方案。
如果我改写它,您需要一个具有以下签名的函数:
pack :: [(String, Bool)] -> [(String, Bool)]
也就是说,您有一个 2 元组列表(第一个元素是String
,第二个元素是Bool
)并且您希望以相同类型的列表结束。
您想过滤此列表中的所有元组,并仅保留具有True
值的元组。 前奏恰好有一个功能:
filter :: (a -> Bool) -> [a] -> [a]
filter
的第一个参数是一个称为predicate的函数a -> Bool
,它允许您定义要在第二个参数(第一个[a]
)中保留的内容。
请注意, a
可以是任何类型,因此我们可以将a
替换a
(String, Bool)
并且filter
将具有以下类型:
filter :: ((String, Bool) -> Bool) -> [(String, Bool)] -> [(String, Bool)]
它开始看起来越来越接近我们的目标签名pack
! 我们缺少的是谓词(String, Bool) -> Bool
,它会告诉filter
我们想要保留什么:
isTrue :: (String, Bool) -> Bool
isTrue (_, True) = True
isTrue (_, False) = False
最后,我们可以在filter
和isTrue
实现pack
:
pack :: [(String, Bool)] -> [(String, Bool)]
pack = filter onlyTrue
您在评论中提到您不想使用任何“内置”功能。 那么让我们摆脱filter
,并编写更接近您发布的原始样式的pack
:
pack [] = []
pack (x:xs)
| isTrue x = x : pack xs
| otherwise = pack xs
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.