簡體   English   中英

haskell 中的元組列表

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

fstsnd的參考鏈接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM