Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 使用列表理解定义zipWith的替代方法,无需辅助函数或扩展_List_Haskell_List Comprehension - Fatal编程技术网

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..]]