我想在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