Haskell列表理解,在两个字符串之间添加一个字符串

时间:2014-02-27 20:50:30

标签: string list haskell list-comprehension

我遇到了一些列表问题。第一个应该在字符串之间插入一个字符串,只要字符串长度相同,即插入“da”[(“so”,“ed”),(“c”,“”),(“”, “”),(“mo”,“le”)]将返回[“sodaed”“da”“modale”]

到目前为止我已经

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]

虽然将[char]与字符串

匹配,但我收到类型错误

2 个答案:

答案 0 :(得分: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]]]

好的,这是一个相当普遍的类型。如您所知,String[Char]相同。因此,如果我们将Char替换为a类型inserts,并将[Char]替换为String,我们可以看到inserts可以专注于String -> [(String,String)] -> [[String]]

所以参数匹配,但结果有一个级别的列表太多。这很合乎逻辑,因为xstrz是字符串,所以[x,str,z]是一个字符串列表。所需要的只是将这三个字符串连接成一个字符串。

您可以使用x ++ str ++ z作为列表推导左侧的表达式“手动”附加列表,也可以使用concat [x,str,z]来执行此操作; concat将列表列表(在这种情况下为Char个行列)展平为列表。


第二次尝试时,你可以使用类似的东西而不是三元组的字符串(x, str, y),你看到你需要做什么吗?

答案 1 :(得分: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)]

,视您的需要而定。