haskell - Haskell中函数的理论定义是什么
问题描述
从基础的角度来看,我想看看 Haskell 中所谓的函数。
看,明确地说,有一些“事物”可以关联地组成,具有恒等函数,从理论上讲,这就足够了。
但是每个人都试图说服我这不是函数的定义方式。一个函数被定义(他们说)为一组来自两个集合(域和 codoman)的元素对,满足某些条件。这意味着一个函数只是一个集合。你不能在不是集合的东西上定义一个函数。
如果我们将这种方法应用于 Haskell,我看到的是该Hask
类别只是 的一个子类别Sets
,在我看来,这看起来很奇怪。
我宁愿扩展函数的概念以适用于我们在 Haskell 中的内容。
在评论中,这个问题是切线的,但不是很深。我想听一个明确的说法,比如“但实际上它们都是集合”,或者“不,我们与集合论无关”。
有任何想法吗?考虑因素?
解决方案
这是一个非常复杂的话题。为了保持简单和易于管理,我们经常偷工减料,经常“撒谎”。
与所有编程语言一样,Haskell 有自己的语法和评估规则(操作语义)。但是,仅从操作的角度考虑编程语言可能会非常限制和麻烦。当我们调用一个factorial
函数时,我们并不关心它是如何实现的,也不关心它提供结果所需的评估步骤的确切数量。
为了克服这种指称语义,有人提出了在某些“数学”模型中逐段解释语法的方法。许多不同的程序(句法表达式)可能映射到相同的解释(“语义”)。
据我所知,整个 Haskell 语言的指称语义从未被定义过。不过,有 Haskell 片段的模型。这些模型通常是类别。
这里有一些例子。
如果我们(非常好!)将 Haskell 限制为一个终止的、简单类型的核,那么我们所需要的只是一个(双)笛卡尔闭范畴,集合的范畴就足够了,它的乘积、联积和指数。
然而,Haskell 没有终止,并且具有一般递归,所以我们需要固定点。通常这可以通过转移到完全偏序类别(通常介于 omega-CPO 或 DCPO 之间)来解决。
然后我们需要类型级别的不动点,因此我们需要考虑一个具有初始 F 代数的类别(至少对于表现良好的函子 F)。这严重地使事情变得更加复杂。
我们还没有添加多态性!这尤其棘手,因为 Reynolds 证明了多态性不能用集合简单地建模(“多态性不是集合论”是主要参考论文)。所以我们现在有 PER 模型和 Coherent 模型(都是类别)作为为多态性提供语义的一些尝试。
然后我们需要类型类、GADT、更高的等级、更高的种类……
在实践中,我们不需要这种复杂程度。在编程时,我们通常会处理有限数量的功能,所以我们对自己“撒谎”,并经常假装一切都像一组一样工作,或者足够接近。然后,如果确实需要,我们会增加复杂性。
推荐阅读
- elasticsearch - Elasticsearch 按好恶排序
- email - Magento 2 电子邮件显示模板提示
- java - 重做 Firebase 数据库读取 onCancelled
- swift - Swift: Using optional if statements correctly
- r - Identify repeats in r
- ms-access - 选择复选框指示字段值的访问项
- r - 从 R 中的包中编辑函数?
- prolog - 序言:
:compile(Filename) 用法和解释 - r - 在 R 中使用与一个数据框合并
- scala - Spark Dataframe Union 提供重复项