在Haskell中,为什么要定义一个带有类型约束的函数:
ghci> :t (==)
(==) :: (Eq a) => a -> a -> Bool
与其将其定义为类型为:
ghci> :t (==)
(==) :: Eq -> Eq -> Bool
ghci> :t (==)
(==) :: (Eq a) => a -> a -> Bool
与其将其定义为类型为:
ghci> :t (==)
(==) :: Eq -> Eq -> Bool
你不会使用第二个版本,因为你会得到一个编译错误。 Eq
不是一个类型,而是一个类型类。你不能在需要类型的地方使用类型类。
如果你定义了自己的类型 MyEq
,然后定义一个类型为 MyEq -> MyEq -> Bool
的函数 ==
,表达式 "hello" == "hello"
将是无效的,因为 "hello"
是 String 类型的值,而不是 MyEq 类型的值。由于 Haskell 中没有子类型,一个值不能同时是 String 类型和 MyEq 类型。
因此,如果你想定义一个可以接受满足特定条件的不同类型值的函数,你需要使用类型类。
let a :: Eq -> Eq -> Bool ; a b c = b == c ; in a 2 2
,查看所得到的错误。 - Aidan Cully