元素的位置

时间:2015-11-15 14:33:32

标签: haskell

该函数应该给我搜索元素的位置。

即: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

除了由于解析错误而无法运行代码之外,它不会显示正确的结果。 有什么建议吗?

1 个答案:

答案 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和元素对,然后使用filtermap来获得结果:

这与您之前尝试的内容相对应

index :: (Eq a, Num t, Enum t) => a -> [a] -> [t]
index b xs =
  map fst . filter ((== b) . snd) $ zip [1..] xs