在(函数式)编程的上下文中,“确定”和“确定”是什么意思?


81

我在关于haskell和函数式编程的博客中读了很多(特别是在sigfpe的博客中),但是我对它的含义一无所知。我大多数时候都不了解它,但是如果我知道的话,我可能会更好地理解这些文本。Google帮不了我。我迷失在技术方面。

同样,世界的非技术含义(“使抽象具体化”)也无法帮助我理解在代码中统一某些东西的实际含义。

我对计算机科学的概念有点慢,所以带有代码的实际示例将是不错的选择。:P

Answers:


40

因此,我阅读了此书,这几乎意味着什么:采用一个抽象的概念并将其具体化。或者,有一个代表抽象概念的代理。例如,在Lisp中,当您使用lambda时,过程抽象和应用程序的概念得以重新定义。

自身的修饰是一个广泛的概念,并不仅仅适用于函数式编程语言。

例如,在Java中,有一些类型在运行时可用。这些是可更改的类型。意思是,在运行时存在类型的抽象概念的具体表示。相反,有不可更改的类型。在Java中使用泛型期间,这一点尤其明显。在Java中,泛型会进行类型擦除,因此泛型类型信息在运行时不可用(除非参数化类型使用无界通配符)。

另一个示例是当您尝试对概念建模时。例如,假设您有一个Group班级和一个User班级。现在有一些抽象的概念描述了两者之间的关系。例如,aUser是a的成员的抽象概念Group。为了使这种关系具体化,您将编写一个名为的方法isMemberOf,该方法说明a是否User为a的成员Group。因此,您在这里所做的是,您已经将组成员身份的抽象概念具体化(真实/明确/具体)。

另一个很好的例子是一个数据库,在该数据库中对象之间具有父子关系。您可以用树的抽象概念描述这种关系。现在假设您有一个函数/方法,可以从数据库中获取此数据并构造一个实际的 Tree对象。什么你现在所做的是物化父子树状关系的抽象的概念变成一个实际的 Tree对象。

回到一般的功能语言,也许最好的例子就是创建Lisp编程语言本身。Lisp是一个完全抽象的理论结构(基本上只是计算机语言的一种数学符号)。一直保持这种方式,直到evalSteve Russel在IBM 704上实际实现Lisp的功能之前:

根据Paul Graham在Hackers&Painters,p。中的报道。185年,麦卡锡说:“史蒂夫·罗素(Steve Russell)说,看,我为什么不编写这个评估程序……,我对他说,ho ,,,您将理论与实践相混淆,这个评估结果旨在阅读,而不是但是他继续做下去,就是说,他将我论文中的评估版编译为IBM 704机器代码,修复了bug,然后将其宣传为Lisp解释器,它的确是这样。本质上就是今天的形式...”

所以Lisp的是物化的,从一个抽象的概念,为实际的编程语言。  


2
似乎根据情况连续存在统一化。虽然抽象的Lisp被具体化为一种编程语言,但编程语言本身却是一种相当抽象的概念,用于传达计算的内容,必须进一步将其抽象化为机器代码,最终被精化为1s到0s,再最终转化为电信号……等等因此,具体化只是抽象的相反(双重)。
CMCDragonkai 2014年

25

化身

实化是实例化的一种形式。验证概念时,您将某些东西抽象化并具体化,就像您提供的字典定义一样。

您可能会选择将一个类型化为一个术语,以驻留在一些可能的类型的抽象语法树中。

您可以通过提出某种语言的通用实现方式来对设计模式进行验证。例如,类似

template<typename T> class Singleton {
    public:
        static T& Instance() {
            static T me;
            return me;
        }

    protected:
       virtual ~Singleton() {};
       Singleton() {};
}

将单例设计模式作为C ++中的模板进行修改。

您可以用您选择的编程语言将Hoare的快速排序想法变成一个实现。因此,我花了很多时间将概念从类别理论转换为Haskell代码。

您可以将一种语言翻译为该语言的解释器。拉里·沃尔(Larry Wall)关于Perl语言的想法被重新定义为perl解释器。

数据具体化真空包具体化方面为表示它是如何在存储器的结构与共享的曲线图。

反射

化的反面是反射,它需要具体的东西,并通常通过忘记一些细节来生成抽象。也许您想要这样做是因为抽象更简单,或者某种程度上抓住了您所讨论内容的本质。

Java,C#等中的类型系统反射采用编程语言编写一个具体的类,并为您提供类的抽象结构,从而使您可以访问类提供的成员列表。在这里,我们采用类型的具体概念,并从中生成一个抽象术语来描述其结构,同时丢弃任何特定值。

就像将编程语言具体化为实现一样,您有时可能会朝相反的方向发展。尽管通常认为这是一个坏主意,但您可以采用一种实现,并尝试从其行为的理想属性中反映语言规范。TeX首先由无规范的Knuth实施。TeX的任何规范都可以从Knuth的实现中得到体现。

(更正式地说,如果您将反射视为健忘的函子,它将您从具体领域带到抽象领域,那么理想情况下,验证就是伴随反射。)

我维护的反射包提供了一个reify方法,该方法采用一个术语并产生表示该术语的类型,然后提供一个反射方法,使您可以生成一个新术语。这里的“具体”域是类型系统,抽象域是术语。


21

Haskell Wiki

“证实”某事物是采取抽象的事物并将其视为实质。一个典型的例子是古人采用抽象概念(例如“胜利”)并将其转变为神灵(例如耐克,希腊胜利女神)的方式。

修饰类型是代表类型的值。使用修饰类型而不是实类型意味着您可以对它们进行任何与值一样的操作。


15

我能想到的一种用法(我敢肯定还有其他用途!)正在将一门课程变成一本字典。让我们Eq上课(/=暂时忘记运算符):

class Eq a where
    (==) :: a -> a -> Bool

如果我们对此类进行分类,则它将变为:

data EqDict a = EqDict (a -> a -> Bool)

可以进行构造,检查等。同样值得注意的是,Eq每个类型只能有一个实例,但是可以有多个EqDict值。但是实例的自动构造(例如,当元素具有列表时获得列表的相等性)不起作用;您必须EqDict [a]自己构建价值。

调整过程如此简单(对于这种情况):

reify :: Eq a => EqDict a
reify = EqDict (==)

使用Eq该类的函数可以转换如下内容:

-- silly example, doesn't really do anything
findMatches :: Eq a => a -> [a] -> [a]
findMatches x ys = [ y | y <- ys, x == y ]

-- version using EqDict
findMatchesDict :: EqDict a -> a -> [a] -> [a]
findMatchesDict (EqDict f) x ys = [ y | y <- ys, f x y ]

如果解开EqDict并仅传递an a -> a -> Bool,则将获得..By功能,例如Data.List.nubBy和朋友-Ord导致的类似技巧Data.List.sortBy


9

即使仅在Haskell的上下文中,该术语也被广泛使用。安迪·吉尔(Andy Gill)的reify软件包使您可以采用递归结构并将其转换为显式图。Sigpfe的后续文章描述了将“其余的计算”概念化为可以传递的值。模板Haskell具有一个reify函数(通常在编译时与TH代码一起执行),当给定Haskell值的名称时,该函数会返回其上的可用信息(在声明的位置,类型等)。

所有这些情况有什么共同点?他们正在谈论采取一些我们可以推理和知道的东西,但是我们不能直接通过编程方式对其进行操纵,并将其变成一个实际的一流价值,我们可以像其他任何名字一样命名和传递。通常,这就是人们使用该词时要传达的意图。


2

我知道RDF中有一个概念化。正如Tim Bernes-Lee所说

在这种情况下,称谓是指使用某种语言在某种语言中表达某种东西,从而使其可以被该语言对待。

我想这有点像反思或内省。希望您在这里得到一些好的答案!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.