这是正确的主张。
positions :: Char -> String -> [Int]
positions c [] = []
positions c xs = [x | (l, x) <- zip xs [1..length xs], l == c]
看起来很优雅,并且采用哈克尔风格。但是,我认为可以为此实现惰性函数。我的意思是,对于无限列表,它也有效。 例如,
let li = 'a':list
head $ positions 'a' li
= 1
我的解决方案是循环因为长度(列表循环计数长度不可能)。
你能帮帮我吗?
答案 0 :(得分:5)
zip xs ys
就会停止。它也很懒惰:
zip (x:xs) (y:ys) = (x,y) : zip xs ys
zip _ _ = []
因此,您不必先获得长度,只需zip
就可以获得无限列表:
zip xs [1..]
如果xs
是有限的,结果将是有限的,如果xs
是无限的,结果也将是无限列表。
顺便说一句,您可以简化您的功能并使其更通用:
positions :: Eq a => a -> [a] -> [Int]
positions c xs = [n | (l, n) <- zip xs [1..], l == c]
毕竟,如果xs
为空,zip xs [1..]
也是空的,在这种情况下,列表推导也是空列表。另外,您想要查看findIndices
中的Data.List
。