如何将此 mergeWords 函数扩展到任意数量的字符串?
How do I extend this mergeWords function to any number of strings?
以下是 mergeWords 函数。
mergeWords [] [] = []
mergeWords [] (y:ys) = y:'\n':(mergeWords [] ys)
mergeWords (x:xs) [] = x:'\n':(mergeWords xs [])
mergeWords (x:xs) (y:ys) = x:y:'\n':(mergeWords xs ys)
如果在 mergeWords "hello" "world"
上应用它会得到
"hw\neo\nlr\nll\nod\n"
我不知道如何将其扩展到字符串列表。就像将它应用于 3 个字符串一样,应该首先获取每个字符串的第一个字符,然后放置一个 '\n',然后是第二个字符,依此类推。
如果按步骤进行,听起来相当简单:
cutWords :: [String] -> [[String]] -- ["ab", "cd", "e"] -> [["a", "c", "e"], ["b", "d"]]
concatWord :: [String] -> String -- ["a", "c", "e"] -> "ace\n"
concatWords :: [String] -> String -- use mergeWord on all of them
最有趣的部分当然是cutWords
部分。您想要的是类似 zip 的行为,为此,如果我们 "safe" tail
和 head
:
会有所帮助
head' (x:xs) = [x]
head' "" = ""
tail' (x:xs) = xs
tail' "" = ""
现在我们可以实施我们的 cutWords
,确保我们及时停止:
cutWords xs = heads : rest
where
heads = map head' xs
tails = map tail' xs
rest = if any (/= "") tails then cutWords tails
else []
那么剩下的部分就无足轻重了:
concatWord word = concat word ++ "\n"
concatWords words = concatMap concatWord word
这个谜题有效地将 列表 的单词合并,一次合并一个字符,并以换行符结尾。
mergeWords :: [String] -> String
我们需要像这样的列表
[ "hello"
, "jim"
, "nice"
, "day"
]
并将其重新排列到给定位置的事物列表中
[ "hjnd"
, "eiia"
, "lmcy"
, "le"
, "o"
]
这就是库函数 transpose
所做的。
然后我们需要制作一个字符串,将它们视为由换行符分隔的行。这就是 unlines
的作用。
所以
mergeWords = unlines . transpose
我们完成了。
以下是 mergeWords 函数。
mergeWords [] [] = []
mergeWords [] (y:ys) = y:'\n':(mergeWords [] ys)
mergeWords (x:xs) [] = x:'\n':(mergeWords xs [])
mergeWords (x:xs) (y:ys) = x:y:'\n':(mergeWords xs ys)
如果在 mergeWords "hello" "world"
上应用它会得到
"hw\neo\nlr\nll\nod\n"
我不知道如何将其扩展到字符串列表。就像将它应用于 3 个字符串一样,应该首先获取每个字符串的第一个字符,然后放置一个 '\n',然后是第二个字符,依此类推。
如果按步骤进行,听起来相当简单:
cutWords :: [String] -> [[String]] -- ["ab", "cd", "e"] -> [["a", "c", "e"], ["b", "d"]]
concatWord :: [String] -> String -- ["a", "c", "e"] -> "ace\n"
concatWords :: [String] -> String -- use mergeWord on all of them
最有趣的部分当然是cutWords
部分。您想要的是类似 zip 的行为,为此,如果我们 "safe" tail
和 head
:
head' (x:xs) = [x]
head' "" = ""
tail' (x:xs) = xs
tail' "" = ""
现在我们可以实施我们的 cutWords
,确保我们及时停止:
cutWords xs = heads : rest
where
heads = map head' xs
tails = map tail' xs
rest = if any (/= "") tails then cutWords tails
else []
那么剩下的部分就无足轻重了:
concatWord word = concat word ++ "\n"
concatWords words = concatMap concatWord word
这个谜题有效地将 列表 的单词合并,一次合并一个字符,并以换行符结尾。
mergeWords :: [String] -> String
我们需要像这样的列表
[ "hello"
, "jim"
, "nice"
, "day"
]
并将其重新排列到给定位置的事物列表中
[ "hjnd"
, "eiia"
, "lmcy"
, "le"
, "o"
]
这就是库函数 transpose
所做的。
然后我们需要制作一个字符串,将它们视为由换行符分隔的行。这就是 unlines
的作用。
所以
mergeWords = unlines . transpose
我们完成了。