首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >“具体化”和“具体化”在(函数式)的上下文中意味着什么?编程?

“具体化”和“具体化”在(函数式)的上下文中意味着什么?编程?
EN

Stack Overflow用户
提问于 2011-03-16 00:36:23
回答 2查看 11.5K关注 0票数 84

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

此外,世界的非技术含义(“将抽象具体化”)并不能帮助我理解在代码中具体化某些东西的实际意义。

我对计算机科学的概念有点迟钝,所以有代码的实际例子会更好。:P

EN

回答 2

Stack Overflow用户

发布于 2011-03-16 01:16:59

我能想到的一个用法(我相信还有其他用法!)就是把一个类变成一本字典。让我们以Eq类为例(暂时不考虑/=操作符):

代码语言:javascript
复制
class Eq a where
    (==) :: a -> a -> Bool

如果我们具体化这个类,它就变成了:

代码语言:javascript
复制
data EqDict a = EqDict (a -> a -> Bool)

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

具体化过程就像这样简单(对于本例):

代码语言:javascript
复制
reify :: Eq a => EqDict a
reify = EqDict (==)

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

代码语言:javascript
复制
-- 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并只传递一个a -> a -> Bool,您将获得..By函数,如Data.List.nubBy和friends - Ord的类似技巧通向Data.List.sortBy

票数 15
EN

Stack Overflow用户

发布于 2011-03-16 01:46:56

即使在Haskell的上下文中,这个术语也被广泛使用。Andy Gill的reify包允许您采用递归结构并将其转换为显式图形。Sigpfe关于continuations的帖子描述了将“计算的其余部分”的概念具体化为一个可以传递的值。模板Haskell有一个reify函数(通常与代码一起在编译时执行),当给定Haskell值的名称时,该函数将返回有关它的可用信息(声明位置、类型等)。

所有这些案例有什么共同之处?他们正在讨论一些我们可以推理和知道的东西,但是我们不能直接通过编程操作的东西,然后把它变成一个实际的第一类值,我们可以像其他任何东西一样命名和传递。这通常是人们在使用这个词时想要传达的意图。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5314884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档