奇怪的存在类型

Sas*_* NF 4 haskell existential-type

http://www.iai.uni-bonn.de/~jv/mpc08.pdf - 在本文中我无法理解以下声明:

instance TreeLike CTree where
...
abs :: CTree a -> Tree a
improve :: (forall m. TreeLike m => m a) -> Tree a
improve m = abs m
Run Code Online (Sandbox Code Playgroud)
  1. 差异(forall m.TreeLike m => ma)带来了(我认为TreeLike m => ma就足够了)

  2. 为什么它允许abs在这里,如果m in ma可以是任何TreeLike,而不仅仅是CTree?

Car*_*arl 9

这是一种排名2型,而不是存在型.这种类型意味着improve必须是多态的论据.您不能将类型Ctree a(例如)的值传递给improve.它在类型构造函数中根本不具体.它显式必须是类型构造函数中的多态,具有类型构造函数实现Treelike类的约束.

对于你的第二个问题,这允许实现improve选择m它想要的任何类型- 它是实现的选择,并且它是由类型系统对调用者隐藏的.实施正好挑Ctreem在这种情况下.那完全没问题.诀窍是调用者improve无法在任何地方使用该信息.

这具有实际结果,即不能使用类型的细节来构造值 - 它必须使用Treelike类中的函数来构造它.但是实现可以选择一种特定的类型来使其工作,允许它在内部使用表示的细节.