gpt4 book ai didi

haskell - 返回列表中某个元素的所有位置,无需递归,但使用列表生成器

转载 作者:行者123 更新时间:2023-12-02 18:26:22 24 4
gpt4 key购买 nike

我们被要求在 Haskell 中自己编写一个函数,当给定一个列表和某个元素时,该函数返回一个新列表,其中包含该元素在该列表中的有序位置。

我已经尝试了很长一段时间了,但是我目前的那个仍然使用递归,任务说我们不应该使用递归。

allPositionsOf :: (Eq a) => a -> [a] -> [Int]
allPositionsOf e es = [i | i <- [0 .. (length es - 1)], IsAtPos e es i]
where
isAtPos :: (Eq a) => a -> [a] -> Int -> Bool
isAtPos e (x:xs) 0
|x == e = True
|otherwise = False
isAtPos e (x:xs) i = findAtPosition xs e (i - 1)

我知道有!!和其他类似的功能,但是否可以只使用列表生成器并使其更简单?

最佳答案

我想你想要类似的东西,对吧?

allPositionsOf :: Eq a => a -> [a] -> [Int]
allPositionsOf b xs = [ i | (i,x) <- zip [0..] xs, x == b]

λ> allPositionsOf 'b' "dfbhjbd"
[2,5]

你几乎已经明白了 - 这是我刚刚添加的唯一一个技巧:

我用[0,1,2,...]zip列表来并排获得索引和元素,拉出一个( index,element) 对(这里是 (i,x)),过滤掉 x == b 的所有内容,然后最终从对中返回索引

关于haskell - 返回列表中某个元素的所有位置,无需递归,但使用列表生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33721533/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com