Haskell - 用于在文本中查找字符位置的惰性函数

时间:2016-03-07 20:44:21

标签: haskell

这是正确的主张。

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

我的解决方案是循环因为长度(列表循环计数长度不可能)。

你能帮帮我吗?

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