如何有条件地将元素插入列表?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何有条件地将元素插入列表?相关的知识,希望对你有一定的参考价值。

说我有一个字符串列表

["hello", "xbox", "blue"]

现在我想在列表中“插入”(如在创建新的不可变列表中)换行字符,但前提是单词在元音上结束,例如一个创建以下列表的函数:

["hello", "
", "xbox", "blue", "
"]

在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, "
"]   -- '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 : "
" : solution2 xs -- Recur, reconstructing as we go.
        else x : solution2 xs        -- Recur, this time with no extra newline.

实际上,这些基本上是相同的 - 列表上的do-notation基本上只是第二种方法的抽象。

需要考虑的事情:我使用了last函数,但是这会在空字符串上失败。你怎么能解决这个问题?

以上是关于如何有条件地将元素插入列表?的主要内容,如果未能解决你的问题,请参考以下文章

正确地将片段插入和删除到 viewpager

如何无条件地将绿色添加图标放在插入行上

如何有条件地将小部件添加到列表中?

如何有效地将元素插入数组的任意位置?

如何有条件地将某些内容封装在 HTML 元素中

如何正确地将多个片段添加到片段过渡?