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