在(function)编程的背景下,“具体化”和“具体化”是什么意思?
我在关于haskell和函数式编程的博客 (特别是在sigfpe的博客 )中阅读了很多关于这个术语的文章,但是我不知道它的含义。 我大部分时间都不知道,但是如果我知道的话,我可能会更好地理解这些文本。 谷歌没有帮助我。 我迷上了技术的东西。
而且,这个世界的非技术含义(“转向抽象的具体”)并不能帮助我理解它在代码中的实际意义。
我对计算机科学概念有点慢,所以用代码的实际例子会很好。 :P
所以我读了这个,这几乎是这个意思:抽象的概念,使其具体化。 或者,有一个代理抽象概念。 例如,在Lisp中,当您使用lambdas时,过程抽象和应用程序的概念就变得有意义了。
自我化是一个广泛的概念,不仅适用于函数式编程语言。
例如在Java中,有些types在运行时可用。 这些是可确定的types。 意思是,在运行时存在types的抽象概念的具体表示。 相反,有不可分类的types。 在Java中使用generics时尤其明显。 在Java中,generics受到types擦除的限制,因此genericstypes信息在运行时不可用(除非参数化types使用无限通配符)。
另一个例子是当你试图build模一个概念。 例如,假设您有一个Group
类和一个User
类。 现在有一些抽象的概念来描述两者之间的关系。 例如, User
是Group
的成员的抽象概念。 为了使这个关系具体化,你可以编写一个名为isMemberOf
的方法来说明User
是否是一个Group
的成员。 所以你在这里做的是你已经将(真实的/明确的/具体的)组织化了抽象的概念 。
另一个很好的例子是在对象之间有父子关系的数据库。 你可以在树的抽象概念中描述这种关系。 现在假设你有一个从数据库中获取这个数据并构造一个实际的 Tree
对象的函数/方法。 你现在所做的是将父子子树关系的抽象概念变成一个实际的 Tree
对象。
一般来说,回到function语言,可能最好的例证就是创build了Lisp编程语言本身。 Lisp是一个完全抽象的理论构造(基本上只是计算机语言的math符号)。 直到Lisp的eval
函数实际上由Steve Russel在IBM 704上实现:
根据保罗·格雷厄姆在“黑客与画家”报道的报道, 185,麦卡锡说:“史蒂夫·罗素说,看,我为什么不编程这个评估……我跟他说,你好,理论与实践混淆,这个评估是为了阅读,而不是但是他继续做下去,就是把我的论文中的eval编译成IBM 704机器代码,修正bug,然后把它当做一个Lisp解释器,当然这是Lisp的解释器。基本上就是今天的forms……“
所以Lisp从一个抽象概念变成了一种实际的编程语言。
物化
物化是一种实例化的forms。 当你具体化一个概念的时候,你需要抽象一些东西,使其具体化,就像你提供的字典定义一样。
你可以select将一个types作为一个术语来居住一些可能types的抽象语法树。
你可以通过为某种语言提出一个通用的实现来devise一个devise模式。 比如,类似的东西
template<typename T> class Singleton { public: static T& Instance() { static T me; return me; } protected: virtual ~Singleton() {}; Singleton() {}; }
在C ++中将单例devise模式作为模板进行了指定。
您可以将Hoare的快速sorting思想转化为您select的编程语言的实现。 在这方面,我花了很多时间将类别理论的概念转化为Haskell代码。
您可以将语言作为该语言的翻译。 Perl的语言Larry Wall的想法被认为是perl的解释器。
data-reify和vacuum包将术语表示为表示如何在共享内存中构build的术语。
reflection
物化的另一面是reflection ,它需要一些具体的东西,并产生一个抽象,通常是忘记一些细节。 也许你想这样做是因为抽象更简单,或者以某种方式捕捉到你正在谈论的内容。
Java,C#等中的types系统reflection需要一种编程语言中的具体类,并为您提供一个类的抽象结构,使您可以访问类的成员列表。 在这里,我们正在考虑一个types的具体概念,并从中产生一个描述其结构的抽象术语,同时丢弃任何特定的值。
就像你如何将一门编程语言转化为一个实现一样,你可能会有相反的方向。 虽然这通常被认为是一个糟糕的主意,但是你可能需要一个实现,并试图从其行为的期望属性中反映出一个语言规范。 TeX是由Knuth,sans规范首先实现的 。 任何规格的TeX都已经从Knuth的实现中反映出来。
(更正式地说,如果你把reflection看作是一个健忘的函子,把你从一个具体的领域抽象到一个抽象的领域,那么理想化后的理想化就是反思。)
我维护的reflection包提供了一个reify方法,该方法需要一个术语并产生一个表示它的types,然后是一个reflection方法,可以让您生成一个新术语。 这里的“具体”域是types系统,抽象域是术语。
来自Haskell Wiki :
“东西化”就是把东西抽象化,把东西看作物质。 一个典型的例子就是古人把抽象的概念(比如“胜利”)转化为神(例如希腊的胜利女神耐克)。
具体化types是表示types的值。 使用指定types而不是实际types意味着您可以对其使用值进行任何操作。
我可以想到的一个用途(我确定有其他的!)正在把一个class级变成一本字典。 让我们来看Eq
类(忘记当前的/=
运算符):
class Eq a where (==) :: a -> a -> Bool
如果我们把这个课程化了,它就变成:
data EqDict a = EqDict (a -> a -> Bool)
可以构build,检查等。 另外值得注意的是,每个types只能有一个Eq
实例,但多个EqDict
值。 但是,实例的自动构造(例如,当您拥有元素时为列表获得平等)不起作用; 您必须自己构buildEqDict [a]
值。
通用化过程就像这样简单(对于这种情况):
reify :: Eq a => EqDict a reify = EqDict (==)
使用Eq
类的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, fxy ]
如果你打开EqDict并传递a -> a -> Bool
,你会得到Data.List.nubBy
函数,比如Data.List.nubBy
和friends – Ord
类似的技巧会导致Data.List.sortBy
。
即使就Haskell而言,这个术语的使用也非常广泛。 Andy Gill的reify软件包允许你采用recursion结构并把它们变成明确的graphics。 Sigpfe的接续文章描述了将“剩余计算”的概念转化为可以传递的值。 模板Haskell具有一个reify函数(在编译时与一般的TH代码一起执行),当给定Haskell的名称时,它返回可用的信息(声明,types等)。
所有这些情况有什么共同点? 他们正在谈论采取我们可以推理和知道的事情,但是我们不能直接编程操纵,并将其转化为实际的一stream价值,我们可以像其他人一样命名和传递。 而这通常是人们在使用这个词时要expression的意图。
我知道RDF中存在物化的概念。 正如Tim Bernes-Lee所述 :
在这种情况下的具体化意味着用语言来expression某种语言的某种东西,这样它就可以被语言所处理。
我想这有点像反思或反思。 我希望你能在这里得到一些很好的答案!