使用带有zipWithN的运算符

sha*_*unc 4 haskell pointfree

说,我们可以这样写:

zipWith (,) [1,2,3] [4,5,6]
Run Code Online (Sandbox Code Playgroud)

如果我们想要列出3个列表,我们可以写:zipWith3(,,)[1,2,3] [4,5,6] [7,8,9]

我们也可以使用 zipWith4 (,,,) zipWith5(,,,,)等等.

现在,我想做同样的事情,但使用添加而不是逗号运算符.有没有办法以相同的简洁方式定义它,而不是像使用lambda那样

zipWith3 (\a b c -> a + b + c) [1, 2, 3] [4, 5, 6] [7, 8, 9]
Run Code Online (Sandbox Code Playgroud)

提前感谢您的回答.

Die*_*Epp 12

听起来你想要"免费"的样式代码\a b c -> a + b + c.让我们知道,一般来说,\a b c -> a + b + c通常更倾向于指向免费代码,因为四周后当你发现一个bug时,它会更容易阅读.

有关于免费节目编程的维基文章(来源).

您还可以安装该pointfree软件包,以便在命令行中解决这些问题.例如,

$ pointfree '\x y z -> x + y + z'
((+) .) . (+)

那么((+) .) . (+)点免费版本(x,y和z是"点",如果你想知道,不,这与几何无关).如果您愿意,可以使用该定义,但大多数人会查看您的代码,并且不知道那些看起来很滑稽的ASCII艺术应该做什么.他们中的一半会用铅笔和纸张来解决这个问题,但是\x y z -> x + y + z眼睛上的原始设计不是那么容易吗?

提示:如果您需要弄清楚某些免费代码的作用,请查看类型:

Prelude> :t ((+) .) . (+)
((+) .) . (+) :: (Num a) => a -> a -> a -> a

或者你可以安装pointful包,这大致相反pointfree.

简介:欢迎来到免费编程的世界,请小心谨慎,以免您的代码无法读取.

  • 或者当然是`add3`,然后把它放在`where`:"...`其中add3 abc = a + b + c`" (3认同)

Ed'*_*'ka 7

另一种选择:适用的仿函数.实际上,Control.Applicative包含newtype定义ZipList(因为列表类型的Applicative有几种可能的定义),可以像这样使用:

import Control.Applicative 

getZipList $ (,,) <$> ZipList [1,2,3] <*> ZipList [4,5,6] <*> ZipList [7,8,9]
Run Code Online (Sandbox Code Playgroud)

或者像那样(对于几个(+)的):

getZipList $ (+) <$> ((+) <$> ZipList [1,2,3] <*> ZipList [4,5,6]) <*> ZipList [7,8,9]
Run Code Online (Sandbox Code Playgroud)

尽管使用applicative functor对于这个特定的问题可能没什么意义,但它们仍然提供了非常强大的抽象/机制来解决类似的任务,所以它们绝对值得学习(例如我们可以摆脱zipWith3,zipWith4 ......等等.