取等于“a”的“xs”的第一个元素,而不使用 takeWhile

Take first elements of 'xs' that are equal to 'a' without using takeWhile

提问人:lafinur 提问时间:3/7/2023 最后编辑:cafce25lafinur 更新时间:3/7/2023 访问量:73

问:

我想编写一个函数,使得该函数是一个包含等于 的第一个元素的列表,这样如果不以列表开头,则列表为空。具体案例将更清楚地表明这一点:f :: a -> [a] -> [a]f a xsxsaxsa

f 3 [3, 3, 2, 1, 3] = [3, 3]
f 3 [1, 3, 3, 2, 1, 3] = []
f 3 [1, 2, 5] = []
f "a" "aaaFS" = "aaa"
f "a" "elephant" = ""

我的问题是在找到值时使递归停止。这让我认为递归本身可能不是解决这个问题的最佳方式。x != a

换言之,虽然编写一个取所有 's from 的函数很容易,但我不知道如何编写一个只取首字母 's from 的函数;这是,一个这样的.axsf' 1 [1, 1, 2, 2, 1] = [1, 1, 1]axsff 1 [1, 1, 2, 2, 1] = [1, 1]

列表 哈斯克尔 滤波器

评论

0赞 willeM_ Van Onsem 3/7/2023
递归。

答:

1赞 willeM_ Van Onsem 3/7/2023 #1

您可以在此处使用递归。事实上,与许多列表处理一样,您可以使用:

f :: Eq a => a -> [a] -> [a]
f y = go
    where go [] = …
          go (x:xs) = …

对于类似过滤器的功能,如下所示:

filter' :: Eq a => a -> [a] -> [a]
filter' y = go
    where go [] = []
          go (x:xs) | x == y = x : go xs
                    | otherwise = go xs

如果我们发现一个不相等的元素,你将不得不在这里防止递归。我把这个留作一个练习。