2014-02-27 149 views
0

我遇到了幾個列表問題。第一個應該是在字符串之間插入一個字符串,只要字符串的長度相同即插入「da」[(「so」,「ed」),(「c」,「」),(「」, 「」),( 「墨子」, 「樂」)將返回[ 「sodaed」 「DA」 「modale」]Haskell列表理解,在兩個字符串之間添加一個字符串

到目前爲止,我

inserts :: String -> [(String, String)] -> [String] 
inserts str pairs = [[x,str,z] | (x,z) <- pairs, length (x) == length (z)] 

inserts' :: String -> [(String, String)] -> [String] 
inserts' [] [] = [] 
inserts' str [(x:xs),(y:ys)] 
    | (length y) == (length x) = (x, str, y) : inserts' str [xs,ys] 
    | otherwise = inserts' str [x,ys] 

我得到一個類型的錯誤,雖然匹配[字符]串

+0

你能發佈你收到的實際錯誤信息嗎? – bheklilr

回答

0

對於類型是正確的,我覺得第一個功能應該是:

inserts :: String -> [(String, String)] -> [String] 
inserts str pairs = [x ++ str ++z | (x,z) <- pairs, length (x) == length (z)] 

inserts :: String -> [(String, String)] -> [[String]] 
inserts str pairs = [[x,str,z] | (x,z) <- pairs, length (x) == length (z)] 

,取決於您的需要。

2

你真的很接近!我很確定你收到的錯誤信息是不同的,但不能匹配[Char]String,因爲這些都是一樣的!

讓我們看到,當我們卸下inserts類型簽名會發生什麼(我在ghci中這樣做,但你當然可以通過文件試試它):

Prelude> let inserts str pairs = [[x,str,z] | (x,z) <- pairs, length x == length z] 
Prelude> :t inserts 
inserts :: [a] -> [([a], [a])] -> [[[a]]] 

OK,這是一個相當一般的類型。您可能知道,String[Char]相同。所以如果我們用Char替代a中的inserts類型,並用String替換[Char],我們可以看到inserts可以專用於String -> [(String,String)] -> [[String]]

所以參數匹配,但結果有一個級別的列表太多。這很合邏輯,因爲xstrz是字符串,所以[x,str,z]是一個字符串列表。所有需要的是將這三個字符串連接成一個。

要麼你可以手動添加列表,使用x ++ str ++ z作爲列表理解左側的表達式,或者可以使用concat [x,str,z]來完成; concat將列表(本例中爲Char個人)的列表整理成列表。


爲了您的第二次嘗試,你可以使用類似的不是字符串(x, str, y)的三元組的東西,你看你需要做什麼?

相關問題