普通函数和类型类函数有什么区别?

What is difference between normal functions and typeclass functions?

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

即使此行为正常的原因是“两个函数具有不同的类型,包括 return 类型(并且表达式是基于这些所有类型计算的)”,这很奇怪,因为我无法定义正常功能那样。

f :: Integer -> Maybe Integer
f = cast

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

普通函数和 class 类型函数有什么区别?

不能以这种方式定义普通函数这一事实是完全不同的。

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