我目前正在学习如何编写类型类。我似乎无法编写具有模糊发生的编译错误的Ord类型类。
module Practice where
class (Eq a) => Ord a where
compare :: a -> a -> Ordering
(<), (<=), (>=), (>) :: a -> a -> Bool
max, min :: a -> a -> a
-- Minimal complete definition:
-- (<=) or compare
-- Using compare can be more efficient for complex types.
compare x y
| x == y = EQ
| x <= y = LT
| otherwise = GT
x <= y = compare x y /= GT
x < y = compare x y == LT
x >= y = compare x y /= LT
x > y = compare x y == GT
-- note that (min x y, max x y) = (x,y) or (y,x)
max x y
| x <= y = y
| otherwise = x
min x y
| x <= y = x
| otherwise = y
错误是
Practice.hs:26:14:
Ambiguous occurrence `<='
It could refer to either `Practice.<=', defined at Practice.hs:5:10
or `Prelude.<=',
imported from `Prelude' at Practice.hs:1:8-15
...
等等。我认为它与Prelude定义的版本发生了冲突。
答案 0 :(得分:21)
问题是你的功能名称与Prelude中的标准名称发生了冲突。
要解决此问题,您可以添加隐藏冲突名称的显式导入声明:
module Practice where
import Prelude hiding (Ord, compare, (<), (<=), (>=), (>), max, min)
...
答案 1 :(得分:13)
hammar是对的,这是因为与标准的Prelude名称发生了冲突。但除Prelude的hiding
名称外,还有另一种解决方案。
您可以导入Prelude qualified:
module Practice where
import qualified Prelude as P
...
接下来,您可以访问您和标准版本的功能:max
将执行您的版本,P.max
将执行标准Prelude。
还有一种方法可以完全隐藏所有标准Prelude函数:GHC的扩展NoImplicitPrelude(http://www.haskell.org/haskellwiki/No_import_of_Prelude)。它可以激活写作
{-# LANGUAGE NoImplicitPrelude #-}
在文件的最开头