我正在浏览Haskell维基书籍GADTS
https://en.wikibooks.org/wiki/Haskell/GADT指南.
我一直很好地跟踪,直到添加了一个Kind签名,它概括了Cons构造函数的约束类型.
data Safe
data NotSafe
data MarkedList :: * -> * -> * where
Nil :: MarkedList t NotSafe
Cons :: a -> MarkedList a b -> MarkedList a c
safeHead :: MarkedList a Safe -> a
safeHead (Cons x _) = x
silly 0 = Nil
silly 1 = Cons () Nil
silly n = Cons () $ silly (n-1)
Run Code Online (Sandbox Code Playgroud)
使用Kind Signature,我可以使用Cons构造函数来构造和模式匹配安全和不安全的MarkedLists.虽然我明白发生了什么,但遗憾的是我难以建立任何关于Kind Signature如何允许这种情况的直觉.为什么我需要种类签名?Kind Signature做什么?
在基础4.4.0.0的Control.Exception文档中,有一个如何创建异常层次结构的示例.该示例显示了如何通过根据父异常声明Exception类的实例来捕获特定异常的概括.这很酷,但是如何让我的例外孩子成为现有例外.例如,我想创建由IOException上的类型约束捕获的异常.Control.Exception中的示例显示了以下内容:
*Main> throw MismatchedParentheses catch (\e -> putStrLn ("Caught " ++ show (e :: SomeCompilerException)))
Caught MismatchedParentheses
*Main> throw MismatchedParentheses catch (\e -> putStrLn ("Caught " ++ show (e :: IOException)))
*** Exception: MismatchedParentheses
Run Code Online (Sandbox Code Playgroud)
如何获取IOException约束来捕获我的异常?