说我有一个字符串列表
["hello", "xbox", "blue"]
现在我想在列表中“插入”(如在创建新的不可变列表中)换行字符,但前提是单词在元音上结束,例如一个创建以下列表的函数:
["hello", "\n", "xbox", "blue", "\n"]
在haskell中最优雅/直接的方式是什么?
这样做的一种方法是使用do
-notation。列表monad上的do
-notation很像列表理解,但它也允许你“返回”多个元素。这是我的实现:
solution1 :: [String] -> [String]
solution1 strings = do
str <- strings -- Go through each element of the list
if last str `elem` "aeiou"
then [str, "\n"] -- 'Replace' that element with the element then a newline
else [str] -- Do nothing.
但这是一种奇怪的处理事情的方式,特别是如果你是初学者。通常的方式是递归,所以让我们这样做:
solution2 :: [String] -> [String]
solution2 [] = [] -- Base case: empty list.
solution2 (x:xs) = -- Inductive case: non-empty list.
if last x `elem` "aeiou"
then x : "\n" : solution2 xs -- Recur, reconstructing as we go.
else x : solution2 xs -- Recur, this time with no extra newline.
实际上,这些基本上是相同的 - 列表上的do
-notation基本上只是第二种方法的抽象。
需要考虑的事情:我使用了last
函数,但是这会在空字符串上失败。你怎么能解决这个问题?