提问人:lafinur 提问时间:3/7/2023 最后编辑:cafce25lafinur 更新时间:3/7/2023 访问量:73
取等于“a”的“xs”的第一个元素,而不使用 takeWhile
Take first elements of 'xs' that are equal to 'a' without using takeWhile
问:
我想编写一个函数,使得该函数是一个包含等于 的第一个元素的列表,这样如果不以列表开头,则列表为空。具体案例将更清楚地表明这一点: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
换言之,虽然编写一个取所有 's from 的函数很容易,但我不知道如何编写一个只取首字母 's from 的函数;这是,一个这样的.a
xs
f' 1 [1, 1, 2, 2, 1] = [1, 1, 1]
a
xs
f
f 1 [1, 1, 2, 2, 1] = [1, 1]
答:
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
如果我们发现一个不相等的元素,你将不得不在这里防止递归。我把这个留作一个练习。
评论