繁体   English   中英

元组模式匹配列表 Haskell

[英]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

最后,我们可以在filterisTrue实现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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM