Haskell - 函数不适用于无限列表
Haskell - Function not working with infinite lists
我写了一个函数,它以各种可能的方式将列表切成两半。
我的问题是我使用了 'lenght' 函数,因此它无法处理无限列表。
我想不出任何真正解决这个问题的方法。
知道我该如何解决这个问题吗?
示例:
splitList "home"= [("","home"),("h","ome"),("ho","me"),("hom","e"),("home","")]
我的代码:
splitList :: [a] -> [([a],[a])]
splitList a = splitList' a
splitList' :: [a] -> [([a],[a])]
splitList' a = take ((length a)+1) (splitList'' 0 a)
splitList'' :: Int -> [a] -> [([a],[a])]
splitList'' i a = (splitAt i a) : splitList'' (i+1) a
length a
将陷入无限列表的无限循环。因此,您将需要以另一种方式递归。您可以递归列表直到到达列表末尾,例如:
splitList :: [a] -> [([a],[a])]
splitList <b>[]</b> = [([], [])]
splitList <b>xa@(x:xs)</b> = ([], xa) : map … (splitList xs)
此处您需要填写 …
部分,其中对于 splitList xs
中的每个元组,您在每个 2 元组的第一项前面加上 x
。
我写了一个函数,它以各种可能的方式将列表切成两半。 我的问题是我使用了 'lenght' 函数,因此它无法处理无限列表。 我想不出任何真正解决这个问题的方法。 知道我该如何解决这个问题吗?
示例:
splitList "home"= [("","home"),("h","ome"),("ho","me"),("hom","e"),("home","")]
我的代码:
splitList :: [a] -> [([a],[a])]
splitList a = splitList' a
splitList' :: [a] -> [([a],[a])]
splitList' a = take ((length a)+1) (splitList'' 0 a)
splitList'' :: Int -> [a] -> [([a],[a])]
splitList'' i a = (splitAt i a) : splitList'' (i+1) a
length a
将陷入无限列表的无限循环。因此,您将需要以另一种方式递归。您可以递归列表直到到达列表末尾,例如:
splitList :: [a] -> [([a],[a])]
splitList <b>[]</b> = [([], [])]
splitList <b>xa@(x:xs)</b> = ([], xa) : map … (splitList xs)
此处您需要填写 …
部分,其中对于 splitList xs
中的每个元组,您在每个 2 元组的第一项前面加上 x
。