【问题标题】:Haskell 'let' implementationHaskell“让”实现
【发布时间】:2014-06-19 02:58:30
【问题描述】:

阅读 Haskell.Happy 文档并实现 'let' 操作符

 Exp : let var '=' Exp in Exp              { \p -> $6 (($2,$4 p):p) }

文档说它是“一个接受变量值环境并返回表达式计算值的函数:”

无法理解语法的实际含义,这些构造在 Haskell 中是如何调用的?

编辑:我的意思是这些

\p -> $6 (($2,$4 p):p)

【问题讨论】:

  • 奇怪的是,如果你不知道 Haskell,那你为什么学习快乐呢?

标签: haskell happy


【解决方案1】:

类似 ML 的语言(例如 Haskell)中的 let 表达式只是引入了局部变量绑定:

magnitude x y =
  let xs = x * x in
  let ys = y * y in
  sqrt (xs + ys)

Happy 文档正在讨论为假设的类 ML 语言实现解析器。 Happy 语法中的$n 变量指的是当前规则中匹配的事物的索引:

let var '=' Exp in Exp
1   2   3   4   5  6

花括号中的表达式是匹配规则时生成的代码。

所以\p -> $6 (($2,$4 p):p) 给你一个lambda,它接受一个变量环境p,它是一对名称和值的列表。 lambda 的主体由在 p 中求值的第二个解析表达式 ($6) 以及名称 ($2) 与在当前环境 ($4 p)。

【讨论】:

  • $4 p, ($2, $4 p) 和 ():p 的语法从何而来?
  • Happy 有它自己特殊的非 Haskell 语法
  • 它们指的是模式中的第 2、第 4 和第 6 个值。例如,Exp : let var '=' Exp in Exp let$1=$2 etc. This means $6 (($2,$4 p):p)` 计算结果为 {2nd exp} ( ({var}, {1st exp} p) : p)。请注意将第一个表达式应用于变量 p 和列表 cons 语法 : 的正常 Haskell 函数应用。
  • @ThomasM.DuBuisson 我知道模式中的值,但无法理解 {2nd exp} 背后的逻辑应用于 (({var}, {1st exp} 应用于 p):p )。第二个 exp 是否适用于元组?在haskell中是怎么调用的?
  • 第二个表达式 $6 被应用到列表 someElem : p 其中 someElem 实际上是 $2$4 p 的元组($4p 的应用)。
【解决方案2】:

基本上,[("x",4),("y",5)] 等环境 p 定义变量 xy 的值。当您评估可能涉及此类变量的表达式时,结果取决于p。这由\p -> ... 表示。

例如,我们可以期待类似的东西

Exp + Exp    { \p -> $1 p + $2 p }

表示使用p 定义的相同变量值来评估这两个术语的事实。

现在,let 很特别,因为它定义了一个新变量,并给它一个值。为了表达这一事实,我们需要更改 p 并用新的关联来扩充它。

let var =  Exp in Exp
$1  $2  $3 $4  $5 $6

给定p,$4 的值就是$4 p,就像我们在前面的 sum 示例中所做的那样(我们假设 var 在 $4 中不可见,也就是说,我们不允许 var递归定义)。写

value_of_$4 = $4 p

但是,$6 的值不是 $6 p,因为 $6 必须“看到”新定义的 var。所以我们写

value_of_$6 = $6 (p augmented with the association <<var = value_of_$4>>)

那是

value_of_$6 = $6 ( ($2,value_of_$4) : p )

那是

value_of_$6 = $6 ( ($2, $4 p) : p )

所以我们结束了

let var =  Exp in Exp    { \p -> $6 ( ($2, $4 p) : p ) }
$1  $2  $3 $4  $5 $6

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多