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

String Haskell列表理解,在两个字符串之间添加字符串,string,list,haskell,list-comprehension,String,List,Haskell,List Comprehension,我遇到了一些问题。第一个假设是在字符串之间插入一个字符串,只要字符串长度相同,即插入“da”[((“so”,“ed”),(“c”,““”),(“,”,(“mo”,“le”),(“mo”,“le”)]将返回[“sodaed”,“da”,“modale”] 到目前为止我有 inserts :: String -> [(String, String)] -> [String] inserts str pairs = [[x,str,z] | (x,z) <- pairs, lengt

我遇到了一些问题。第一个假设是在字符串之间插入一个字符串,只要字符串长度相同,即插入“da”[((“so”,“ed”),(“c”,““”),(“,”,(“mo”,“le”),(“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]
inserts::String->[(String,String)]->[String]

插入str对=[[x,str,z]|(x,z)要使类型正确,我认为第一个函数应该是:

inserts :: String -> [(String, String)] -> [String]
inserts str pairs = [x ++ str ++z | (x,z) <- pairs, length (x) == length (z)]
inserts::String->[(String,String)]->[String]
插入str对=[x++str++z |(x,z)[(字符串,字符串)]->[[String]]

inserts str pairs=[[x,str,z]|(x,z)您真的很接近!我很确定您收到的错误消息与无法匹配
[Char]
字符串不同,因为它们是相同的

让我们看看当我们删除
inserts
上的类型签名时会发生什么情况(我在ghci中执行此操作,但您当然也可以通过文件进行尝试):

Prelude>let inserts str pairs=[[x,str,z]|(x,z):t inserts
插入::[a]->[([a],[a])]->[[a]]
好的,这是一种相当普遍的类型。你可能知道,
String
[Char]
是一样的。因此,如果我们在
inserts
的类型中用
Char
替换
[Char]
,我们可以看到
inserts
可以专门化为
String->[(字符串,字符串)]->[[String]]

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

您可以“手动”添加列表,使用
x++str++z
作为列表理解左侧的表达式,也可以使用
concat[x,str,z]
执行此操作;
concat
将列表(在本例中为
Char
acters)展平到列表中



在第二次尝试中,您可以使用类似的东西来代替字符串的三元组
(x,str,y)
,您看到需要做什么了吗?

您能发布您收到的实际错误消息吗?
inserts :: String -> [(String, String)] -> [[String]]
inserts str pairs = [[x,str,z] | (x,z) <- pairs, length (x) == length (z)]
Prelude> let inserts str pairs = [[x,str,z] | (x,z) <- pairs, length x == length z]
Prelude> :t inserts
inserts :: [a] -> [([a], [a])] -> [[[a]]]