你有没有发现什么用途哈斯克尔上位的类型?(What uses have you found for

2019-08-16 20:15发布

更高级别类型的样子很有趣。 从哈斯克尔维基谈到这个例子:

foo :: (forall a. a -> a) -> (Char,Bool)
foo f = (f 'c', f True)

现在,我们可以评估foo id没有编译器爆炸。 这个例子是紧接着在书中用真实世界的例子,我在其他一些地方已经看到:在ST单子和runST 。 这很酷。

但是我还没有碰到过,我解决了与更高等级的参数写我自己的函数问题的情形。 你有没有? 你有等级2或等级-N多态性在野外的什么例子?

Answer 1:

看看像功能withRepoLock中的darcs源 。

拥有的darcs多库格式的支持,并且支持通过类型类表示。 所以,你可以编写代码,是在仓库格式的通用性。 当实际读取磁盘上的存储库您想通过数字出什么格式的存储库中,并选择合适的类型类实例化一些常用代码派遣到该代码。



Answer 2:

Weirich和Washburnn的“箱香蕉去”! ( 纸 , 幻灯片 )

这里是什么它是所有关于一个非常粗略的,可能有些不太准确的解释:给予感应式,BGB让你代表的功能,该类型分别是“积极”的空间 - 他们的论点,他们从来没有区分辨别。 在大多数它们包括它们的参数为(通常是同一类型)以外的值的一部分。

Weirich +沃什伯恩使用此获得probably- 足够的演算的高阶像差表示-XRankNTypes哈斯克尔(已经有人证明了它足够了吗?)。

我用它在这里 (警告:乱码),以转

(forall g . GArrow g => g () x -> g () y)

(forall g . GArrow g => g x y)

这工作,因为秩为2的多态类型不能“考察”其参数的结构 - 所有可以做的是“粘贴”这样的说法成更大的结构。 一些挂羊头卖狗肉让我找出其中的粘贴操作,然后我线程粘贴点(S)(如果有的话)回出到的输入GArrow

你不能用做Control.Arrow类,因为整个Haskell的功能空间通过“泄漏”到它arr



Answer 3:

最近有人问在这里堆栈溢出问题,这可能与更高级别类型来解决。

另一种应用是在废你的样板纸。



Answer 4:

这可能是因为你遇到的问题,其中排名较高的类型将是有益的,但没有意识到这一点。 例如在例子的darcs他们可以很容易地没有排名较高的类型来实现它。 取而代之的将是对调用者必须确保他们遵守,如选择功能的正确实例存储库格式某些功能的前提条件。

较高等级的类型的优点是,它传递从程序员的编译器获得这一权利的责任。 与传统的方法,如果一个开发商的darcs犯了一个错误与库类型的结果要么是一个运行时错误或者损坏的数据。 随着较高等级的类型的开发者获得在编译时错误类型。



文章来源: What uses have you found for higher-rank types in Haskell?