This post提出了 !!
情况的问题。接受的答案告诉我们,您实际上正在做的是创建一个新函数 !!
,然后您应该避免导入标准函数。
但是,如果新函数要应用于与标准函数不同的类型,为什么要这样做呢?编译器不是可以根据参数选择合适的吗? 是否有任何编译器标志允许这样做?
例如,如果 *
没有为 [Float] * Float
定义
为什么编译器会哭
> Ambiguous occurrence * > It could refer to either `Main.*', defined at Vec.hs:4:1 > or `Prelude.*',
for this code:
(*) :: [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
最佳答案
允许编译器根据函数的类型选择正确的函数实现是类型类的目的。没有他们这是不可能的。
要了解这种方法的合理性,您可以阅读介绍它们的论文:How to make ad-hoc polymorphism less ad hoc [PDF]。
关于haskell - 为什么 Haskell 无法解析 "overloaded"运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33177019/