普通函数和类型类函数有什么区别?
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 类型函数有什么区别?
不能以这种方式定义普通函数这一事实是完全不同的。
类型 类 的全部目的是允许 重载 - 即定义多个具有不同类型但名称相同的不同函数。并让编译器根据上下文中预期的类型自动选择正确的。
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 类型函数有什么区别?
不能以这种方式定义普通函数这一事实是完全不同的。
类型 类 的全部目的是允许 重载 - 即定义多个具有不同类型但名称相同的不同函数。并让编译器根据上下文中预期的类型自动选择正确的。