该函数应该给我搜索元素的位置。
即:index'b'“dfbhjbd” - > [3,6]
我到目前为止:
索引b(x:xs)=长度(takeWhile(/ = b)xs)
但是在找到匹配元素后takeWhile会立即停止。所以下面的元素将被遗漏。
我试过这样的事情:index b (x:xs) = length ( tak b xs )
where
tak b [] = []
tak b xs
| b /= x == x:tak b xs
| otherwise = [], tak b xs
除了由于解析错误而无法运行代码之外,它不会显示正确的结果。 有什么建议吗?
答案 0 :(得分:0)
你已经看到了takeWhile
的问题 - 我可以理解为什么你试过这个(毕竟你想要使用length
)但也许你应该试着找到一个解决方案不必首先使用length
。
一个好的方法可能是在遍历输入列表时跟踪indizes,然后查找等于`b
的元素如果你想使用递归,那么你可以一路走下去:
index :: (Eq a, Num t) => a -> [a] -> [t]
index b xs = index' 1 xs
where
index' _ [] = []
index' i (x:xs)
| b == x = i : index' (i+1) xs
| otherwise = index' (i+1) xs
例如
λ> index 'b' "dfbhjbd"
[3,6]
你可以看到我在这里使用了一个内部函数来处理indizes和递归
另一种方法是使用zip
获取indizes和元素对,然后使用filter
和map
来获得结果:
这与您之前尝试的内容相对应
index :: (Eq a, Num t, Enum t) => a -> [a] -> [t]
index b xs =
map fst . filter ((== b) . snd) $ zip [1..] xs