2014-06-19 54 views
3

閱讀Haskell.Happy文件,達成的「讓」操作哈斯克爾'讓我們實現

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

文檔說這是「一個函數,變量值的環境中,並返回的計算值實施表達式:「

無法理解語法的實際含義,這些結構在Haskell中如何調用?

編輯:我的意思是這些

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

奇怪的是,如果你不知道哈斯克爾那麼爲什麼你學習快樂嗎? –

回答

5

在ML狀語言(如Haskell中)甲let表達只是引入了一個局部變量綁定:

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

快樂文檔正在談論實施一個假想的ML類語言的解析器。在快樂語法$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)的結果之間的關聯。

+0

其中$ 4 p,($ 2,$ 4 p)和():p的語法來自哪裏? – Herokiller

+1

快樂有它自己特殊的非Haskell語法 –

+1

它們指代模式中的第2,4和6個值。例如'Exp:let var'='Exp in Exp'''''是'$ 1','='是'$ 2等。這意味着$ 6(($ 2,$ 4 p):p)'評估爲'{ 2nd exp}(({var},{1st exp} p):p)'。注意正常的Haskell函數將第一個表達式應用於變量'p'和列表cons語法':'。 –

2

基本上,環境p[("x",4),("y",5)]定義變量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正如我們在前面的總和例子一樣(我們假設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