【问题标题】:Position of elements元素的位置
【发布时间】:2015-11-15 14:33:32
【问题描述】:

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

e。 : 索引 '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

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

【问题讨论】:

    标签: haskell


    【解决方案1】:

    您已经看到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 获取成对的索引和元素,然后使用filtermap 获取结果:

    这对应于你之前尝试过的

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

    【讨论】:

    • 谢谢。我不太明白过滤器是如何工作的。为什么我只得到数字而不是(1,g)?
    • 这不是过滤器 - 它是第一个函数 map fst - fst(对于 first)将为您提供 2 元组的第一部分:@ 987654332@ 和 map 将此函数应用于过滤列表中的所有元素
    • 没必要 - 很难看出你是否不习惯这种写东西的方式
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多