簡體   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