Haskell - 重新定义(隐藏)算术运算符

Dar*_*rio 8 syntax haskell functional-programming notation

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

例如

class Mul a b c | a b -> c where
    (*) :: a -> b -> c
Run Code Online (Sandbox Code Playgroud)

这似乎与...结合使用

import Prelude hiding ((*))
Run Code Online (Sandbox Code Playgroud)

隐藏标准*运算符.但是当然所有通常的乘法也必须起作用,所以我必须定义类似的东西

instance (Num t) => Mul t t t where
    (*) = ??
Run Code Online (Sandbox Code Playgroud)

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


编辑 -

import qualified
Run Code Online (Sandbox Code Playgroud)

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

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

那么两者结合在一起吗?就像是

import Prelude qualified ((*))
Run Code Online (Sandbox Code Playgroud)

Mic*_*zyk 23

回答编辑过的问题:

你可以做

import Prelude hiding ((*))
import qualified Prelude as P
Run Code Online (Sandbox Code Playgroud)

除了(*)通常的方式和(*)通过P前缀访问所有Prelude函数:

x = 5 + 3   -- works
y = 5 P.* 3 -- works
z = 5 * 3   -- complains about * not being in scope
Run Code Online (Sandbox Code Playgroud)