List 使用列表理解定义zipWith的替代方法,无需辅助函数或扩展
我知道您可以将List 使用列表理解定义zipWith的替代方法,无需辅助函数或扩展,list,haskell,list-comprehension,List,Haskell,List Comprehension,我知道您可以将zipWith和zip定义为: zipwith'f xs ys=[f x y |(x,y)如果没有zip您必须使用一些可以说是基本的列表访问函数,即,drop和takeWhile。这两个函数都是内置的,因此,不是您想要避免的“助手函数”: zipW :: (a -> b -> c) -> [a] -> [b] -> [c] zipW f xs ys = [z | [z] <- takeWhile (not.null)
zipWith
和zip
定义为:
zipwith'f xs ys=[f x y |(x,y)如果没有zip
您必须使用一些可以说是基本的列表访问函数,即,drop
和takeWhile
。这两个函数都是内置的,因此,不是您想要避免的“助手函数”:
zipW :: (a -> b -> c) -> [a] -> [b] -> [c]
zipW f xs ys = [z | [z] <- takeWhile (not.null)
[z | [z] <- takeWhile (not.null) -- ~ map (head.head)
[ [ [c | (c:_) <- [drop i r]] -- ~ take 1 . drop i
| (r:_) <- [drop i rs]] -- ~ take 1 . drop i
| let rs = [[f x y | y<- ys] | x<- xs], i <- [0..]]]]
因为现在可以使用!!
访问列表(当然,仍然是二次的):
~>拿4$zipWi(,)[0..][10..]
[(0,10)、(1,11)、(2,12)、(3,13)]
为了使其线性化,递归解可以用展开器
,迭代
等进行编码,但我认为不能用列表理解。我认为不理解O(n^2)是不可能的.AFAIK,不是。默认情况下,列表理解使用列表的monad实例,特别是>=
函数,该函数是使用concatMap
实现的。[f x y|x@KennyTM如何在O(n^2)中实现的?[f x y|(x,i)@user2108462:With(!!)
和长度
。这可以算作帮助函数。。。
zipWi f xs ys = [ rs !! i !! i | let rs = [[f x y | y<- ys] | x<- xs], i <- [0..]]