【发布时间】:2015-10-17 09:54:47
【问题描述】:
在 Haskell 中实现即席多态(函数重载)的方法是通过类型类(请参阅this、this 和this 问题的答案等)。
但我正在努力为以下情况定义重载的mult(产品)函数:
mult: [Double] -> Double -> [Double]
mult: Double -> [Double] -> [Double]
mult: [Double] -> [Double] -> [Double]
谢谢
(至少需要 case 1 [Double]*Double 和 case 3 [Double]*[Double])。
【问题讨论】:
-
你为什么要这个?只是因为Matlab allows multiplying anything you throw at it doesn't mean this is a good idea。查看vector-space 以正确处理多维乘法。或者,如果你不太关心数学的优雅,你可以使用hmatrix(实际上很像 Haskell 中的 Matlab/Octave)或linear。
-
@leftaroundabout 感谢您的链接。你的意思是这种多态性不是一个好主意(不仅matlab允许)? “一般”或在 Haskell 中这是一个坏主意吗?
-
嗯,我认为这通常是个坏主意,在 Haskell 中真的没有必要,因为你可以写
map (*x) ys或zipWith (*) xs ys来明确你的意图。这当然不适用于应该同时处理标量和向量的多态代码——但是,编写这样的代码来处理任何长度的标量或列表是自找麻烦。指定哪个列表需要与哪个其他列表匹配的长度以及结果的长度等是很尴尬的。这就是vector-space或linear的亮点,因为它们在编译时检查尺寸。 -
@leftaroundabout 感谢您的帮助。
标签: haskell overloading