我的头衔可能有点偏,我会试着更好地解释一下我想要实现的目标.
基本上我要说我有一个清单:
["1234x4","253x4",2839",2845"]
现在我想将包含元素5的字符串的所有位置添加到新列表中.在当前示例中,结果列表将是:
[1,3]
为此我已经完成了类似的功能elem
:
myElem [] _ = False myElem [x] number = if (firstCheck x) then if digitToInt(x) == number then True else False else False myElem (x:xs) number = if (firstCheck x) then (if digitToInt(x) == number then True else myElem xs number) else myElem xs number
其中firstCheck x
检查该检查元素不是"X"或"#"
现在,在我当前的函数中,我获得了包含元素的第一个元素位置,但是我的头部仍然在如何获取完整列表:
findBlock (x:xs) number arv = if myElem x number then arv else findBlock xs number arv+1
哪里arv
是0,number
是我正在寻找的号码.
例如输入:
findBlock ["1234x4","253x4",2839",2845"] 5 0
结果将是1
任何帮助,将不胜感激.
您想要的功能已存在于Data.List
模块中,名称为findIndices
.您可以简单地(elem '5')
用作谓词.
http://hackage.haskell.org/package/base-4.8.1.0/docs/Data-List.html#v:findIndices
如果,由于某种原因,你不允许使用内置的,它带有一个非常漂亮的定义(虽然实际使用的那个有一个更复杂,更有效的一个):
findIndices p xs = [ i | (x,i) <- zip xs [0..], p x]
顺便说一句,我通过搜索Hoogle的类型找到了这个函数[a] -> (a -> Bool) -> [Int]
,其中(模数参数排序)显然是函数必须具有的类型.找出Haskell的最佳方法是考虑它需要的类型并搜索Hoogle或Hayoo的类型.Hoogle是更好的IMO,因为它在类型上略有模糊匹配; 例如,Hayoo不会通过我给出的类型在这里找到函数,因为它以相反的顺序获取参数.