ast*_*vat 3 haskell operator-overloading
我正在使用多值逻辑并尝试重载基本逻辑函数.
我没有重载Num和Eq运算符的问题,但我不知道如何重载&&, ||和not.
可能吗?谢谢你的回答!
lef*_*out 10
Haskell根本没有真正的重载(= ad-hoc-polymorphism).+,*等没有功能,但是类方法:"重载"他们更像限定OO接口/纯粹抽象类的具体后代比,比方说,C重载函数++.
逻辑运算符OTOH只是普通函数,它们在Prelude中一劳永逸地定义.
但是,在Haskell中,中缀运算符大多被视为一种特殊的函数名称,它们不是实际语法定义的一部分.没有什么能阻止您定义具有相同目的的新的不同运算符,例如
class Booly b where
true :: b
false :: b
(&&?) :: b -> b -> b
(||?) :: b -> b -> b
infixr 3 &&?
infixr 2 ||?
instance Booly Bool where
true = True
false = False
(&&?) = (&&)
(||?) = (||)
instance Booly MVBool where
true = ...
Run Code Online (Sandbox Code Playgroud)
事实上,如果新名称被模块限定符消除歧义就足够了:
import Prelude hiding ((&&), (||))
import qualified Prelude
class Booly b where
true :: b
false :: b
(&&) :: b -> b -> b
(||) :: b -> b -> b
infixr 3 &&
infixr 2 ||
instance Booly Bool where
true = True
false = False
(&&) = (Prelude.&&)
(||) = (Prelude.||)
Run Code Online (Sandbox Code Playgroud)