String Haskell列表理解,在两个字符串之间添加字符串
我遇到了一些问题。第一个假设是在字符串之间插入一个字符串,只要字符串长度相同,即插入“da”[((“so”,“ed”),(“c”,““”),(“,”,(“mo”,“le”),(“mo”,“le”)]将返回[“sodaed”,“da”,“modale”] 到目前为止我有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
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]]]