考虑来自Prelude的功能zipWith.还有其他函数,例如zipWith3...... zipWith7,它们只有参数的数量不同.有许多类似的例子,在其他语言中也是如此(scala,ocaml).
创建具有特定数量元素的函数的原因是什么?为什么不使用通用版?也许zipWith从应用的参数数量中得出特别的结果
Lui*_*las 11
zipWith确实存在广义版本:它是ZipList应用程序的函子:
import Control.Applicative
zipWith f a1 a2 = getZipList (f <$> ZipList a1 <*> ZipList a2)
zipWith3 f a1 a2 a3 = getZipList (f <$> ZipList a1 <*> ZipList a2 <*> ZipList a3)
Run Code Online (Sandbox Code Playgroud)
等等.问题是,使用构造zipWithN函数包装所有内容的函数通常会更快ZipList.
编辑: chi的评论指出我并不像我应该那样清楚.关键是ZipList包装器允许我们使用适用的f <$> x1 <*> ... <*> xn习语来压缩任何数量的元素类型与类型兼容的列表f.
理论上可以在Haskell中编写一个具有可变数量参数的函数,一些库很好地使用它,但是没有什么能够超越编译器可以更容易地优化单个函数的清晰度和效率.这些zipWithN功能易于使用,对初学者和高级用户都有意义,并且能够很好地完成工作.
如果你需要一个zipWith所有列表都具有相同类型的N路,那么只需使用Data.List.transpose:
zipWithN :: ([a] -> b) -> [[a]] -> [b]
zipWithN f = map f . transpose
Run Code Online (Sandbox Code Playgroud)
如果你需要列表有不同的类型,你可能会错了.根据定义,异构列表在Haskell和大多数其他静态类型语言中并不是微不足道的.
| 归档时间: |
|
| 查看次数: |
139 次 |
| 最近记录: |