【发布时间】:2015-10-16 18:13:47
【问题描述】:
This post 对 !! 的情况提出了问题。接受的答案告诉我们,您实际上在做的是创建一个新函数!!,然后您应该避免导入标准函数。
但是,如果新功能要应用于与标准功能不同的类型,为什么要这样做呢?编译器不是可以根据其参数选择正确的吗? 是否有任何编译器标志允许这样做?
例如,如果* 没有为[Float] * Float 定义
为什么编译器会哭
> 模棱两可的出现 * > 它可以引用在 Vec.hs:4:1 中定义的任何一个 `Main.*' > 或 `Prelude.*',对于此代码:
(*) :: [Float] -> Float -> [Float]
(*) as k = map (\a -> a*k) as -- here: clearly Float*Float
r = [1.0, 2.0, 3.0] :: [Float]
s = r * 2.0 -- here: clearly [Float] * Float
main = do
print r
print s
【问题讨论】:
-
你可以用
s = r * 2.0 where (*) = (Main.*)和(*) as k = map (\a -> a*k) as where (*) = (Prelude.*)提示编译器
标签: haskell operator-overloading