Haskell中的参数化

在我的 Haskell 学习之旅中,我不禁注意到参数化在语言中是最重要的。鉴于类型系统和编译器的推理能力如何工作,我认为可以肯定地说参数化或参数化多态性是自然的、鼓励的并且是语言哲学的核心。

虽然我要问的问题不是特定于 Haskell 的,几乎可以向任何编程语言社区提出,但鉴于上述语言的性质,我对 Haskells 的观点很感兴趣。

为什么参数化对 Haskellers 如此重要?该语言确实鼓励对泛型类型进行编码,并在某种程度上让编译器在最合适的时间(也被迫)找出正确的类型。当然,不必坚持这一点,我们可以并且声明类型可能是一种很好的做法。

但不知怎的我有一种感觉,这一切都鼓励你一开始要泛型,而不是专注于具体类型,通过类型类将你需要的能力添加到签名中,最后专注于组合,延迟具体类型,或者把它留给编译器。

我不完全确定我在说什么,但感觉就是这样。

我可能有偏见,因为我在 Scala 中阅读了一本书,这也鼓励了这一点,尽管与 Haskell 相比,它的手动活动要多得多。

对此有什么哲学回应吗?我对此有一些想法,但从您的角度来看,参数化如何帮助编程更快、更安全?

注:我是一名学习 Haskell 的 Scala 程序员

编辑

我在学习“从第一原理开始编程 Haskell”时说明了我的建议。引用作者:

“在使用具体类型时,需要牢记一些注意事项。关于参数化和类型类的好处之一是,您可以明确地说明您对数据的意图,这意味着您不太可能犯一个错误。Int 是一个大数据类型,有很多居民和许多类型类和为其定义的操作——很容易让函数做一些意想不到的事情。而如果我们要写一个函数,即使我们有 Int考虑到它的值,它使用受我们想要的类型类实例约束的多态类型,我们可以确保我们只使用我们想要的操作。这不是万能药,但有时可以避免这些具体类型(和其他)原因。

(第 208 页)。”

我想知道其他原因是什么......我的意思是与 Scala 相比,这种参数化更手动,在语言中如此成熟,我不禁认为这是生产力的一部分语言哲学。

回答

参数化很重要,因为它限制了实现空间。通常情况下,适当的参数类型将实现空间限制为缺乏底部的单个实现。例如fst :: (a, b) -> a,考虑。对于这种类型,函数中只有一个可能的返回值没有底部。

有很多方法来编写它具有底部 - undefined、 、error、无限循环,所有这些都在定义的 eta 扩展以及对的构造函数是否匹配方面有所不同。许多这些差异可以通过仔细的方式从外部观察到,但它们的共同点是它们不会产生可用的(非底部) type 值a

这是实现定义的强大工具。考虑到参数化的保证,实际上只测试那个就足够了fst ((), ()) == ()。如果该表达式的计算结果为True,则实现是正确的。(好吧,在 ghc 中并不是那么简单,因为它能够用不安全的函数破坏各种规则。您还需要验证实现没有使用任何破坏参数的不安全的东西。)

但指导实施只是第一个好处。实现如此有限的结果是参数化也将类型转换为简洁、精确和机器检查的文档。您知道无论实现是什么,它可以返回的唯一非底部值是该对的第一个元素。

是的 - 通常事情并不像fst. 但是在类型中存在参数多态性的每种情况下,它都会限制实现空间。每次实现空间受到限制时,这些知识都会作为类型实现的机器检查文档。

参数化对于代码的实现者和用户来说都是一个明显的胜利。它减少了错误实现的空间,并提高了文档的准确性和准确性。这应该与编程中的客观好事一样接近。


以上是Haskell中的参数化的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>