高阶类型看起来很有趣。从Haskell wikibook获得以下示例:
foo :: (forall a. a -> a) -> (Char,Bool)
foo f = (f 'c', f True)
现在我们可以在不让编译器爆炸的情况下评估foo id
了。这个例子很快就被书中的真实世界例子所跟随,我在其他地方也看到过:ST单子和runST
。那很酷。
但我还没有遇到过通过编写具有高阶参数的自己的函数来解决问题的情况。你有吗?你们有什么关于排名2或排名n多态性的例子吗?
高阶类型看起来很有趣。从Haskell wikibook获得以下示例:
foo :: (forall a. a -> a) -> (Char,Bool)
foo f = (f 'c', f True)
现在我们可以在不让编译器爆炸的情况下评估foo id
了。这个例子很快就被书中的真实世界例子所跟随,我在其他地方也看到过:ST单子和runST
。那很酷。
但我还没有遇到过通过编写具有高阶参数的自己的函数来解决问题的情况。你有吗?你们有什么关于排名2或排名n多态性的例子吗?
Weirich和Washburnn的“Boxes go Bananas”!(论文, 幻灯片)
这是一个非常粗略且可能稍有不准确的解释:给定归纳类型,BGB允许您表示从该类型到“正面”的函数空间 - 它们从不在其参数上进行情况区分。最多,它们将其参数包括为其他值的一部分(通常是相同类型的值)。
Weirich+Washburn使用这个来获得一个可能-足够的HOAS表示lambda演算在-XRankNTypes
Haskell中(是否有人已经证明它是足够的?)。
我在这里(警告:代码混乱)使用它来转换一个
(forall g . GArrow g => g () x -> g () y)
转换为一个
(forall g . GArrow g => g x y)
GArrow
的输入。Control.Arrow
类无法做到这一点,因为整个Haskell函数空间通过arr
泄漏到其中。withRepoLock
等函数。runSupply :: (forall a. Eq a => Supply a -> b) -> b