首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Haskell中实现zipWith N

如何在Haskell中实现zipWith N
EN

Stack Overflow用户
提问于 2022-07-22 20:02:47
回答 2查看 171关注 0票数 0

在我的代码中,zipWith7工作得很好,但是现在zipWith7中的函数需要额外的特性。

代码语言:javascript
复制
zipWith8 (\a b c d e f g h-> ....) List-A  ... List-H

而haskell基础库只支持多达7个版本。

有什么方法可以将函数扩展到N zipWithN

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-22 20:37:14

这是一个简单的方法(并不是说zipWith8和朋友是真正需要的!)是利用ZipList类型和Applicative运算符。

代码语言:javascript
复制
zipWith8 f a b c d e f g h = getZipList $
  f <$> ZipList a
    <*> ZipList b
    <*> ZipList c
    <*> ZipList d
    <*> ZipList e
    <*> ZipList f
    <*> ZipList g
    <*> ZipList h

如果你愿意的话,我敢肯定你可以从中找到写zipWith9等的方法。

旁白:这是在学习Haskell与应用程序打交道的章节中提到的

除了zipWith之外,标准库还有一些函数,比如zipWith3zipWith4,一直到7。zipWith接受一个函数,它接受两个参数,并与它一起压缩两个列表。zipWith3接受一个函数,它接受三个参数,并在其中压缩三个列表,依此类推。通过使用具有应用程序样式的zip列表,我们不必为我们想要一起压缩的每个列表都有一个单独的zip函数。我们只是使用应用程序样式将任意数量的列表与函数压缩在一起,这非常酷。

票数 3
EN

Stack Overflow用户

发布于 2022-07-22 20:12:10

如果同时使用zip函数,则可以将前两个列表减少一个:

代码语言:javascript
复制
zipWithNplus1 f xs1 xs2 xs3 ... xsNplus1 =
   zipWithN (uncurry f) (zip xs1 xs2) xs3 ... xsNplus1

否则,启用ParallelListComp并编写一个并行列表,以理解任何一种特性:

代码语言:javascript
复制
[ f x1 ... xN
| x1 <- xs1
| x2 <- xs2
| x3 <- xs3
...
| xN <- xsN
]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73085556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档