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

问题描述 投票:-1回答:1

说我有一个字符串列表

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

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

["hello", "\n", "xbox", "blue", "\n"]

在haskell中最优雅/直接的方式是什么?

haskell
1个回答
3
投票

这样做的一种方法是使用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函数,但是这会在空字符串上失败。你怎么能解决这个问题?

© www.soinside.com 2019 - 2024. All rights reserved.