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
普通函式和型別類函式有什么區別?
uj5u.com熱心網友回復:
您不能以這種方式定義普通函式這一事實是完全不同的。
型別類的全部目的是允許多載——也就是說,定義多個具有不同型別但名稱相同的不同函式。并讓編譯器根據背景關系中預期的型別自動選擇正確的型別。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/427257.html
標籤:哈斯克尔
