Hutton 在 Haskell 中编程 说:
具有函数形式的表达式应用于一个或多个可以通过执行应用程序“减少”的参数,称为可简化表达式,或简称 redex。
是一个可简化的表达式,即 redex 完全
一个函数应用程序,其中该函数不是另一个函数应用程序的结果,
等效地,函数是函数名还是 lambda 表达式的函数应用程序?
以上两点中的任何一点是否都是对我之前在最外层评估策略如何评估函数的部分应用和柯里化函数的应用的问题的答案?
Hutton 在 Haskell 中编程 说:
具有函数形式的表达式应用于一个或多个可以通过执行应用程序“减少”的参数,称为可简化表达式,或简称 redex。
是一个可简化的表达式,即 redex 完全
一个函数应用程序,其中该函数不是另一个函数应用程序的结果,
等效地,函数是函数名还是 lambda 表达式的函数应用程序?
以上两点中的任何一点是否都是对我之前在最外层评估策略如何评估函数的部分应用和柯里化函数的应用的问题的答案?
什么算作 redex 通常取决于语言。表达式的语法以各种结构的引入和消除形式出现;redex 是一种特定类型的结构的引入和消除形式适当地并列。
对于函数,lambdas 是引入(它们是创建函数的规范方法,而以前没有),应用程序是消除(它们是使用函数的规范方法)。因此,redex 函数是将 lambda 应用于某事物,例如某种形式的事物(\x -> e1) e2
。(只有这个!变量对某物的应用不是函数redex。通常我会假设这是隐含的,但你的问题明确地询问了这个,所以......)
对于声明,let
-bindings 或类似的是介绍(它们是声明名称具有给定值的规范方式),变量是消除(它们是使用声明值的规范方式)。因此,声明 redex 是绑定范围内的一个术语,let
它引用了一个let
-bound 变量,例如某种形式let x = e1 in e2
wheree2
提及x
。
对于代数数据类型,类型的数据构造函数是引入(它们是在类型中创建值的规范方式),case
表达式是消除(它们是使用代数类型值的规范方式)。因此,代数数据类型 redex 是一个case
其审查对象是完全饱和的构造函数应用程序,例如case Constructor arg1 arg2 arg3 ... of pat1 -> e1; pat2 -> e2; ...
.
这些只是配对的一些示例。并非所有语言都具有所有这三种结构。还有一些语言带有额外的结构(例如可变引用、异常等,每个都有自己的引入和消除形式)。但我认为这应该让您了解“redex”的含义:它是一种结构,可以在其中进行一些计算以在确定表达式的值方面取得进展。
您还问(在链接条目的评论中) “mult(3) 不是部分应用程序,所以有意义吗?”
我想我在回答你之前的一个问题时已经回答了这个问题。
不,类型mult
is (Int, Int) -> Int
,即它的参数必须有 type (Int, Int)
。但3
不能有那种类型;它的类型很简单Int
。为了计算 的结果mult 3
,定义
mult :: (Int, Int) -> Int
mult (x, y) = x * y
咨询,计算过程如下:
mult 3
= case 3 of (x, y) -> x * y
***error: pattern match failure
实际上,如果 Haskell 是一种无类型语言,情况就是如此。由于它有types,因此在编译过程中检测到 和 的类型不匹配,3
并且(Int, Int)
程序被拒绝。(*)
(*) 3 :: Num a => a
,即它的类型可以是Int
,Float
等,但它肯定不能是元组……好吧,如果没有Num
为元组定义实例,它就不能,但是假设没有。这也意味着在发现没有为任何导入的模块中的任何元组类型定义Num实例之后,程序实际上将在运行时被拒绝......但让我们将其作为脚注。