是否有可能在Haskell中重载逻辑运算符(&& eg)?

ast*_*vat 3 haskell operator-overloading

我正在使用多值逻辑并尝试重载基本逻辑函数.

我没有重载NumEq运算符的问题,但我不知道如何重载&&, ||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)