[英]Is pattern matching in Set Comprehensions in Haskell possible, or what is an alternative?
我正在嘗試確定是否可以在Haskell集合理解中進行模式匹配。 我有一個包含元組或嵌套列表和元組的列表。
例如
[[(1,("A",1)), (2,("B",1))], [(0,("A",1)), (3,("B",2)), (2,("C",1))]]
我想丟棄包含“ A”的元組,並對其他元組執行任意計算。
我一直在思考:
pack(xs:xss) = [package x | x <- xs, x /= (1,("A", 1))] : (pack xss)
pack(_) = []
package x = case x of
(i, ("B", j)) -> (i + j, ("B", j * i))
(i, ("C", j)) -> (i * j, ("C", j + i))
(otherwise) -> x
以下內容可能允許使用通配符:
x /= (1,("A", 1))
如:
x /= (_,("A", _))
值得注意的是,嵌套元組中的數字將始終為int類型,不確定是否有幫助...
我環顧四周,但看不到是否可行,如下所示,似乎過濾是一個更好的選擇。 但是我們正在過濾未知數。
我的問題是從較大的工作/功能中提取的一個抽象示例,但希望我已經在這里抓住了問題的實質。 我願意接受其他建議。
如果要過濾與模式匹配的元素,則可以在<-
的左側使用模式,例如
... = [package x | x@(_, ("A", _)) <- xs] : ...
這將丟棄任何與模式不匹配的內容。
過濾與模式不匹配的元素不是很好。 您可以使用case
表達式作為防護來做到這一點,但是它有點難看。
... = [package x | x <- xs, case x of (_,("A", _)) -> False; _ -> True] : ...
一個更漂亮的選擇是將模式匹配移到一個函數中。
... = [package x | x <- xs, want x] : ...
where want (_,("A", _)) = False
want _ = True
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.