haskell 不使用takeWhile获取“xs”中等于“a”的前几个元素

f8rj6qna  于 2023-03-08  发布在  其他
关注(0)|答案(1)|浏览(113)

我想写一个函数f :: a -> [a] -> [a],使得f a xs是一个包含xs中第一个等于a的元素的列表,使得如果xs不是以a开头,则列表为空,具体情况会更清楚:

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时使递归 stop,这使我认为递归本身可能不是处理这个问题的最佳方法。
换句话说,虽然很容易编写一个从xs中获取所有a的函数,例如f' 1 [1, 1, 2, 2, 1] = [1, 1, 1],但我不知道如何编写一个只从xs中获取初始a的函数;这是f,使得f 1 [1, 1, 2, 2, 1] = [1, 1]

6psbrbz9

6psbrbz91#

你可以在这里使用递归。事实上,和很多列表处理一样,你可以使用:

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

如果我们发现一个不相等的元素,你必须防止递归。我把这个作为练习。

相关问题