Existential quantification可以用来实现异质列表,Haskell 98虽然不支持,但是还是可以模拟一下。能不能完全模拟我还不清楚,不过实现异质列表是没问题的。
思路就是把函数部分应用到数据之后(结果类型要相同)再放到一个新的data type里。
Haskell 98:
newtype ShowBox = ShowBox { _show :: String }
mkShowBox x = ShowBox (show x)
list = [mkShowBox 1, mkShowBox 'A', mkShowBox "Hello"]
这其实就是直接把String
包装起来,这和下面这个本质是一样的:
list = [show 1, show 'A', show "Hello"]
这时候ExistentialQuantification
其实没什么用。