我是新的哈斯克爾。我想始終檢查字串中的第一個元素,并將字串與串列中的 Char 值進行比較。因此,首先我將“H”與“E”進行比較,然后將“H”與“F”進行比較,然后將“H”與“G”進行比較,最后將“H”與“H”進行比較。如果“H”='H',那么我想將串列元素的輸出字串值添加到我的輸出字串值中,在我的情況下,'H' 是“GG”。但是如果所有四個都不相等,那么我想在我的案例“A”中添加列出當前字符。所以我希望我的輸出看起來像這樣 ["GG","A","GG","A"] 你知道一些解決方案嗎?
我的代碼:
findc :: String -> [(Char, String)] -> [String]
findc str list =
let filtered = [ if inputChar `elem` [(str !! num)] then decodedValue else if inputChar /= (str !! num) then [(str !! num)] else [] | num<-[0..(length str)-1],(inputChar,decodedValue) <- list]
in filtered
輸入:
findc "HAHA" [('E', "AB"), ('F', "CD"), ('G', "EF"), ('H', "GG")]
輸出不良:
["H","H","H","GG","A","A","A","A","H","H","H","GG","A","A","A","A"]
uj5u.com熱心網友回復:
您的函式正在使用具有有效嵌套回圈的串列理解。它回圈遍歷字串的索引,然后遍歷您傳入的元組串列中的元素。兩者都包含 4 個元素,因此您的串列理解迭代 16 次并且最終在錯誤輸出中得到 16 個元素是很自然的.
更簡單、正確的方法
[(Char, String)]描述了一個查找表。
幸運的是,Haskell 為我們提供了這個lookup功能。
:ghci> :t lookup
lookup :: Eq a => a -> [(a, b)] -> Maybe b
ghci> tbl = [('E', "AB"), ('F', "CD"), ('G', "EF"), ('H', "GG")]
ghci> lookup 'H' tbl
Just "GG"
ghci> lookup 'A' tbl
Nothing
現在,您只需要將其映射到串列推導中的字串,以與Just案例不同的方式處理Nothing案例。
ghci> [case lookup ch tbl of {Just s -> ...; Nothing -> ...} | ch <- "HAHA"]
["GG","A","GG","A"]
使用 Data.Maybe.maybe
不出所料,Data.Maybe 庫具有處理Maybe.lookup
case expr1 of { Just x -> expr2; Nothing -> expr3 }
可以表示為:
maybe expr3 (\x -> expr2) expr1
所以我們可以寫:
ghci> [maybe ... ... $ lookup ch tbl | ch <- "HAHA"]
["GG","A","GG","A"]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/528495.html
標籤:哈斯克尔
