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

时间:2014-06-04 10:53:47

标签: haskell terminology

我对术语感到困惑。

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

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

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

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

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

感谢您阅读

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

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

enter image description here

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

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

enter image description here

编辑4:整个讲座系列可以找到here

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

我现在完全糊涂了。 基本问题是,当Giesl教授说“对象”时它意味着什么?他的意思是什么?特别是在his 9th lecture讲座中。

编辑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".

Giesl教授写道。

1 个答案:

答案 0 :(得分:6)

Haskell language report

中的术语“对象”

对象通常是语言报告中 value 的同义词:

  

§34.1.4编组可存储对象列表

     

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

     

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

此处,我们将[a]称为a类型的对象的集合。

因此:

[4, 8, 42, 16, 23, 15]

被视为对象的集合。

  

§3.15.1字段选择

     

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

使用字段标签,我们指的是记录语法和由它自动生成的函数。例如,给出了:

data Sample = Sample { a :: Int, b :: Double }

生成以下函数:

a :: Sample -> Int
b :: Sample -> Double

每个函数都从“对象”中提取特定值。

  

§4.2.1代数数据类型声明

     

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

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

Just "ok"
Nothing

都被视为对象以及:

[1, 3, 4]
  

§6.3.2奥德类

     

Ordering 数据类型允许单个比较来确定两个对象的精确排序。

这里我们指的是Ordering,它是用于在两个值之间进行比较时表示“小于”,“大于”和“等于”的数据类型。

08讲座的意思

教授说:

  

评估IO ()类型的对象会导致执行此操作。

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

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

main = putStr "sample"

当调用main来运行程序时,"sample"将应用于函数putStr(其类型为String -> IO ()),以便生成{{ 1}}值,有效打印IO ()作为副作用。

技术术语”定义为“”:

  

§41.1IOmonad

     

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

     

实际上只有一种方法可以“执行”I / O操作:将它绑定到程序中的Main.main。运行程序时,将执行I / O.不能从任意函数执行I / O,除非该函数本身在IO monad中,并且在某个点直接或间接地从Main.main调用。

09讲座的意思

教授说:

  

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

return的类型是:

return

这是一个接受任何值的函数,并“生成”包含该值的return :: a -> IO a 类型的值。这是另一种情况,他使用 object 作为 value 的同义词。

对象与表达式

  

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

嗯,不。我不认为你是对的。表达式不是 / 对象。举个例子:

IO a

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

在Haskell中,表达式必须产生值,但不一定是值。另一方面,if x then 0 else 42 0都是值表达式。