haskell - 为什么 Haskell 无法解析 "overloaded"运算符?

标签 haskell operator-overloading

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/

相关文章:

c++ - 运算符重载和堆与堆栈的混淆

haskell - 没有 "cabal upgrade"的最佳解决方法是什么?

haskell - 如何将状态与管道一起使用?

haskell - haskell 中的累加器

c++ - C++中operator[]()一定要是成员函数吗?

ios - 如何在swift中重载赋值运算符

C++ 逗号运算符重载和引用 vector

c++ - 为什么不使用只读 [] 运算符?

haskell - applicative functor 和 monad 的等价

按索引对 haskell 中的元组数组进行排序