我想在Haskell中重新定义几个算术运算符,以使其更具扩展性和通用性。

例如。

class Mul a b c | a b -> c where
    (*) :: a -> b -> c

这似乎与
import Prelude hiding ((*))

隐藏标准的*运算符。但是当然所有普通的乘法也必须起作用,所以我必须定义类似
instance (Num t) => Mul t t t where
    (*) = ??

如何在此处访问原始的*运算符(Prelude.(*)不起作用),以及如何定义实例类型以使1 * 1与Monomorpism限制不冲突?

编辑-
import qualified

是一个很好的提示,谢谢。

但是不幸的是,这迫使我将所有标准方法都明确地纳入了范围。我只想有可能重新定义某些绑定(bind),而使其余绑定(bind)保持不变。

那么两者兼而有之吗?就像是
import Prelude qualified ((*))

最佳答案

回答编辑后的问题:

你可以做

import Prelude hiding ((*))
import qualified Prelude as P

以通常方式访问除(*)之外的所有Prelude函数,并通过(*)前缀访问P:
x = 5 + 3   -- works
y = 5 P.* 3 -- works
z = 5 * 3   -- complains about * not being in scope

10-08 12:49