在 Haskell 中重载全局 && 运算符无法编译

Overloading global && operator in Haskell fails to compile

我有一个 hs 文件,试图重载 && 运算符

(&&)::Bool->Bool->Bool
True && x = x
False && _ = False

and' :: (Bool)->Bool
and' xs=foldr (&&) True xs

导入 Prelude 时出现错误:

Ambiguous occurrence ‘&&’
It could refer to either ‘Main.&&’, defined at D:\baby.hs:2:6
                      or ‘Prelude.&&’,
                         imported from ‘Prelude’ at D:\baby.hs:1:1
                         (and originally defined in ‘GHC.Classes’)

所以我把最后一行改成了

and' xs=foldr (Main.&&) True xs

现在打印新的错误信息:

Couldn't match expected type ‘t0 Bool’ with actual type ‘Bool’
In the third argument of ‘foldr’, namely ‘xs’
In the expression: foldr (Main.&&) True xs

我该如何解决这个问题?谢谢。

正如@zakyggaps 在他的评论中所说,(Bool)Bool 相同。你的意思显然是[Bool]。此外,您实际上并不是 "overloading" 这个函数,而是在不同的模块中定义一个类似名称的函数。 "Shadowing" 充其量,但实际上还不是。

Haskell 中没有重载。标识符可以使用类型类共享,但 && 不是类型类的成员,因此不能共享。当您定义自己的 && 运算符时,它会与 Prelude 中自动导入的运算符发生冲突。要无条件使用你的&&,你必须隐藏Prelude.&&如下:

import Prelude hiding ((&&))

(&&) :: Bool -> Bool -> Bool
True && b = b
False && _ = False

第二个错误是and'类型的错误或拼写错误,应该是and' :: [Bool] -> Bool而不是and' :: (Bool) -> Bool