普通函数和类型类函数之间的区别是什么


class (Typeable e, Show e) => Exception e where
toException   :: e -> SomeException
fromException :: SomeException -> Maybe e
toException = SomeException
fromException (SomeException e) = cast e
data MyException1 = Exception1A | Exception1B
deriving (Show)
instance Exception MyException1
data MyException2 = Exception2A | Exception2B
deriving (Show)
instance Exception MyException2

它能够定义多个异常。因此,也可以定义多个fromException函数。我觉得这很奇怪,因为两个函数可以有相同的名称和相同的输入。

fromException :: SomeException -> Maybe MyException1
fromException :: SomeException -> Maybe MyException2

即使这种行为是可以的原因是";两个函数具有不同的类型,包括返回类型(并且基于这些所有类型来评估表达式(";,这很奇怪,因为我不能那样定义正常函数。

f :: Integer -> Maybe Integer
f = cast
f :: Integer -> Maybe Char
f n = cast $ show n

普通函数和类型类函数之间的区别是什么?

不能用这种方式定义正常函数,这就是全部区别。

类型类的全部目的是允许重载,也就是说,定义具有不同类型但名称相同的多个不同函数。让编译器根据上下文中预期的类型自动选择正确的类型。

最新更新