[英]List of tuples in haskell
給定一個元組列表asd:: [(Char, Char)]
,我想編寫一個 function ,它接受一個字符串並返回相同的字符串,其中與asd
中元組的第一個元素匹配的字符替換為相應的第二個元素。
例如,使用asd = [('a', 'b'), ('c', 'd')]
,輸入"ac"
,它應該返回"bd"
。
我還想寫一個 function 做相反的事情,當給定輸入"bd"
應該返回"ac"
。
我有一個解決方案,但我不能使用列表生成器和遞歸。
這是我的解決方案:
xyz :: String -> String
xyz x = concat (map y x) where y ys = [a | (b,a) <- asd, ys == b]
zyx x :: String -> String
zyx x = concat (map y x) where y ys = [a | (a,b) <- asd, ys == b]
我如何在沒有遞歸和列表生成器的情況下編寫它?
等待澄清評論中的確切規范,我假設您要替換字符,同時保持不匹配的原樣。
要將 function 應用於列表的每個元素( String
只是[Char]
),請使用map:: (a -> b) -> [a] -> [b]
。 因此,您需要像這樣在輸入字符串上寫一個 map
xyz :: String -> String
xyz = map replace
這個replace
function 應該遍歷元組asd
的列表,並找到第一個匹配的元組。 (我在這里做一個假設,因為沒有指定如何處理多個匹配的元組。)為此,我們使用filter:: (a -> Bool) -> [a] -> [a]
查找匹配的元組。
replace :: Char -> Char
replace c = case filter ((== c) . fst) asd of
((_, c'):_) -> c' -- found a replacement
[] -> c -- no match, don't replace character
其中((== c). fst)
將元組的第一個元素與字符c
進行比較。
最后,要實現反向 function,只需做同樣的事情,但替換由第二個元素查找,就像這樣
zyx :: String -> String
zyx = map replace'
replace' :: Char -> Char
replace' c = case filter ((== c) . snd) asd of
((c', _):_) -> c' -- found a replacement
[] -> c -- no match, don't replace character
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.