Haskell术语澄清:"评估对象"(用于Giesl教授的Haskell讲​​座系列)

jhe*_*dus 5 haskell terminology

我对术语感到困惑.

在38. min的这个讲座中http://youtu.be/0u8eTSc5Gmo Giesl教授提到了"对象的评估"这个术语.这更准确地意味着什么?

我知道您可以在Haskell中评估表达式,但评估对象意味着什么?

对象本身是一个表达式吗?

Haskell中的对象是什么?Int 1是一个对象吗?函数是一个对象吗?

Haskell中的表达式是什么?应用于对象的函数?

谢谢阅读

编辑:根据SICP,数字是一个表达式,因此在这个意义上,数据对象(如数字)也是一个表达式,因此可以对其进行求值.

编辑2:以下是Giesl教授讲义的相应部分.在这些讲义中,他说:"对IO()类型表达式的评估"所以也许这也是他在视频讲座中所说的"物体评价"时的意思.

在此输入图像描述

编辑3:59.min Giesl教授写道并说'解释器只能评估IO()类型的对象.

在这一点上,我真的开始觉得,当他说对象时,他意味着表达.我对吗 ?所以对象不是一个值(如对这个问题的一些评论所建议的),而是一个表达式(在他的讲座中).这是正确的解释吗?请一位在Haskell知识更多的人比我确认我的怀疑是否正确.

在此输入图像描述

编辑4:整个讲座系列可以在这里找到.

编辑5:在他的第9讲的开头,他使用术语对象,他指的是什么?我认为他不是指价值观,也不是表达方式.他是否在代数数据类型意义上引用了数据对象?

我现在完全糊涂了.基本问题是,当Giesl教授说"对象"时它意味着什么?他的意思是什么?特别是在他的第9讲演讲中.

编辑6:

通过与Giesl教授的私人电子邮件沟通:

I used the words "object" and "value" as a synonym for "expression".
So when I speak about "evaluation of objects", 
in fact I mean "evaluation of expressions".
Run Code Online (Sandbox Code Playgroud)

Giesl教授写道.

Sho*_*hoe 6

Haskell语言报告中的术语"对象"

一个对象往往是同义在语言报告:

§34.1.4编组可存储对象的列表

withMany :: (a -> (b -> res) -> res) -> [a] -> ([b] -> res) -> res

withXXX在一个对象列表上复制一个组合子,产生一个编组对象列表

这里我们称之为类型对象[a]集合.a

因此:

[4, 8, 42, 16, 23, 15]
Run Code Online (Sandbox Code Playgroud)

被认为是对象的集合.

§3.15.1场选择

字段标签用作选择器功能.当用作变量时,字段标签用作从对象中提取字段的函数.

对于字段标签,我们指的是记录语法和由它自动生成的函数.举例来说,例如:

data Sample = Sample { a :: Int, b :: Double }
Run Code Online (Sandbox Code Playgroud)

生成以下函数:

a :: Sample -> Int
b :: Sample -> Double
Run Code Online (Sandbox Code Playgroud)

每个函数都从" 对象 "中提取特定值.

§4.2.1代数数据类型声明

arity k的数据构造函数创建一个具有k个组件的对象.这些组件通常在位置上作为表达式或模式中构造函数的参数进行访问.对于大型数据类型,将字段标签分配给数据对象的组件很有用.

在上面的引用中我们可以看到数据构造函数创建了一个对象.因此:

Just "ok"
Nothing
Run Code Online (Sandbox Code Playgroud)

都被认为是对象以及:

[1, 3, 4]
Run Code Online (Sandbox Code Playgroud)

§6.3.2奥德类

订购数据类型允许单个比较,以确定两个对象的精确顺序.

这里我们指的Ordering是在两个值之间的比较中用于表示"小于","大于"和"等于"的数据类型.

08讲座的意义

教授说:

对类型对象的评估IO ()具有执行该动作的效果.

他指的是当IO ()有效地需要IO ()值时,执行计算值的动作的主体.

例如,main需要一种IO ()数据类型:

main = putStr "sample"
Run Code Online (Sandbox Code Playgroud)

main被调用运行程序时,"sample"将应用于函数putStr(具有类型String -> IO ())以产生IO ()值,有效打印sample作为副作用.

" 技术术语 "定义为" 一个值 ":

§41.1IOmonad

类型IO a的值是一种计算,当执行该计算时,在返回类型a的值之前执行一些I/O.

实际上只有一种方法可以"执行"I/O操作:将它绑定到程序中的Main.main.运行程序时,将执行I/O. 这是不可能从任意的函数执行I/O,除非该功能本身在IO单子并在某些时候被称为直接或间接地从Main.main.

讲座09的意思

教授说:

... return获取一个值并返回包含值的对象.

return的类型是:

return :: a -> IO a
Run Code Online (Sandbox Code Playgroud)

这是一个接受任何值的函数,并"生成" IO a包含该值的类型的值.这是另一种情况,他使用对象作为的同义词.

对象与表达

在这一点上,我真的开始觉得,当他说对象时,他意味着表达.我对吗?

好吧,不.我不认为你是对的.表达式不是/对象.举个例子:

if x then 0 else 42
Run Code Online (Sandbox Code Playgroud)

是一个表达式(如语言报告中的开头§3所述),但不是.

在Haskell中,表达式必须产生一个值,但不一定是值.另一方面0,42它们都是价值观表达方式.