2013-10-20 37 views
-1

我想輸入2個元素列表(僅字母),其中第一個元素是字符串中的一個字母(findAndReplace的第二個參數),第二個是我想要的變化至。 Haskell中是否有一個函數可以做類似的事情?因爲這會有很大幫助!在Haskell中查找並替換

+2

你嘗試了什麼?你究竟在哪裏卡住? – Matthias

+0

我甚至不知道從哪裏開始! – James

+3

寫下類型。 – Ingo

回答

1

聽起來更像是您可能想要使用元組列表而不是第一個輸入的列表列表,因爲您指定了固定長度。元組的固定長度,其可具有混合類型的集合,而列表是單一類型的任意長度的集合:

myTuple = ('a', 'b') :: (Char, Char) 
myTriple = ('a', 'b', 'c') :: (Char, Char, Char) 
myList = ['a'..'z'] :: [Char] 

聲明I如何必須指定的元組的每個字段的類型。另外,(Char, Char)而不是(Char, Char, Char)相同類型,它們不兼容。

因此,與元組,你可以有你的類型簽名replace爲:

replace :: [(Char, Char)] -> String -> String 

現在這個規定與該類型的簽名,它必須是對字符的列表來查找和替換,你不需要處理不好的輸入,就好像某人只給了一個角色去尋找而不是一個來代替它。

我們現在正在傳遞所謂的關聯列表,而Haskell甚至有一些內置函數用於在Data.ListData.Map中處理它們。但是,對於這個練習,我認爲我們不需要它。

現在你想解決使用對列表這個問題,但是,如果我們解決了只用一對是它會更容易:

replace1 :: (Char, Char) -> String -> String 
replace1 (findChr, replaceChr) text = ? 

現在,您要檢查每個字符的text,如果它等於findChr,則要用replaceChr替換它,否則不要保留它。

replace1 (findChr, replaceChr) text = map (\c -> ...) text 

我會讓你填寫細節(提示:if-then-else)。

然後,您可以使用此函數使用更簡單的replace1函數來構建您的replace函數。這應該讓你開始,如果在一兩天之後仍然無法解決問題,請在下面評論,我會給你另一個提示。

+0

這完全是多餘的。 OP想要用一個其他角色替換一個角色。 –

+0

「我想輸入一個包含2個元素列表的**列表,其中第一個元素是一個字母......第二個是我想要它更改爲」 – bheklilr

+0

嗯,這取決於它。我希望該設施能夠取代一個,兩個或二十個字母,這取決於我給它的字符串。 – James