我有兩個串列——一個是元組的網格串列,另一個是坐標串列——要進行比較,這樣坐標串列始終是網格串列的子串列。現在我想檢查網格串列中的每個元組是否在坐標串列中。如果存在,則將網格串列中的元組替換為“#”,如果不存在,則替換為“_”。
下面是我最好的嘗試,它永遠不會奏效。
getHash :: [(Int,Int)] -> [(Int,Int)] -> [String]
getHash [(x1,y1)] [(x2,y2)] | (x1,y1) `elem` [(x2,y2)] : (x1,y1) = "#"
| otherwise (x1,y1) = "_"
where (x1,y1) <- [(x1,y1)]
uj5u.com熱心網友回復:
您希望將串列中的每個元素替換為"#"或"_"取決于該元素是否是第二個串列的元素。我們可以把它分成兩部分。第一部分,“將串列中的每個元素替換為以該元素為引數呼叫函式的結果” map。第二個,根據一個專案是否是串列的元素來做一些事情,確實使用elem. 所以我們會
map在一個串列和- 呼叫
elem每個元素, - 將其與已知坐標串列進行比較,以及
- 根據呼叫的結果決定用哪個字串替換串列中的元素
elem。
getHash known xs = map (\x -> if x `elem` known then "#" else "_") xs
現在,我為什么要先給出已知串列?這主要是個人喜好,但我認為部分應用效果更好。getHash [(1,2)]是將作為引數給出的串列與靜態“已知”串列進行比較的函式。既然xs是它的正確位置,我們也可以在定義中使用 eta 歸約:
getHash known = map (\x -> if x `elem` known then "#" else "_")
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/531460.html
標籤:列表哈斯克尔元组
上一篇:確定日期在串列中是否連續
