在 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
。
我有一个 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
。