我遇到了一些列表问题。第一个应该在字符串之间插入一个字符串,只要字符串长度相同,即插入“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]与字符串
匹配,但我收到类型错误答案 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]]
。
所以参数匹配,但结果有一个级别的列表太多。这很合乎逻辑,因为x
,str
和z
是字符串,所以[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)]
,视您的需要而定。