Question:

ex4.5是要我們解釋甚麼?
是說第一步用beta解完之後再另外用意義去解釋可以得到相同的答案?

Answer:

將 desurgared 後所得的 lambda expression ,進行 reduction 以求得 normal form ,
並解釋為何這個 normal form 的確是我們想要的。

Question:

在課本p.68 有個"compositionality"
請問那是甚麼意思? 是說在做denotational semantics時不要管下一層的內容?

Answer:

Compositionality 意指運算式如 e1 + e2 的語意,可以只單由子運算式
e1 及  e2 的語意組合 (compose) 而成,也就是課本 p. 71 所說的:

E[[ e1 + e2 ]] (s) = E[[ e1 ]] (s) + E [[ e2 ]] (s)

Question:

"a grammar is ambiguous"(p.54)是說同一種結果只能由一種parse tree獲得?
那p.55中間有一段"A grammar that allows this combination is ambiguous"
這兩個ambiguous意義一樣嗎?
另外只要加了 precedence與associativity就可以解決ambiguous的問題對吧?

Answer:

這個部份我覺得課本還講得蠻清楚的。 根據一個語法 (grammar) ,在某些句子 (sentence)
會有兩種解析樹的生成方式的話,那這個語法被稱為「具歧義的語法」 (the grammar is ambiguous) 。
透過 precedence 與 associativity 可以解決某些歧義性的問題,
但不是所有歧義性的問題的問題都可以靠 precedence 與 associativity 來解決。

Question:

在 5.4.3 小節中的 Value Declarations 中

提到 <cons> 的 BNF 為 <cons> := <pattern>::pattern

請問這部份的 pattern 有沒有角括弧 <>, 差別是在哪編呢?? 

Answer:

課本的錯,應該是:

<cons> := <pattern> :: <pattern>

Question:

同樣是 5.4.3 小節, 的 Function Declarations 中

的 length function:

fun length(nil) = 0
  | length(x::xs) = 1 + length(xs)

為甚麼在 list 的 constructor 中的 x:xs 會剛好把 list 分成前面一個 element 和後面的 list

比如說 val x:xs = [1, 2, 3];

為甚麼是 val x = 1 : int
             val xs = [2,3] : int list

而不是 val x = [1, 2] : int list
          val xs = [3, 4] : int list

而且  的 BNF 並沒有定義 nil

那為甚麼又會有 nil 這個 constructor 呢??

Answer:

注意,以上你所寫的,若是關於串列的 contructors ,應該是 "::" ,不是 ":" 。
基本上你可以把 SML 中 'a list 這個內建的資料型態的定義,想成如下:

datatype 'a list = []
                 | :: of 'a * 'a list

nil 和 [] 都表示空串列。(只要用語習慣的問題,有人習慣寫 [] 有人習慣 nil , SML 兩者都支援。)

也可以參考 Riccardo Pucella 所寫的 "Notes on Programming Standard ML of New Jersey"
38 頁起 2.8 Lists 的章節,以及 23 頁起 2.4 Pattern matching 的章節。

Question:

有關於 PL HW3 的 Exercise 5.1(p.122)

請問哪邊可以下載 Algol 60 嗎??

我照著

http://www.angelfire.com/biz/rhaminisys/algol60.html

的網頁所抓到的編譯器

沒有辦法正確運作

能請教授多給一點提示嗎 @_@? 

Answer:

這一題我認為不需要真的寫一個可以被編譯、可被執行的  Algol 60 程式。
只要能瞭解題目的敘述,寫出一小段類似  Algol 60 的擬意程式 (pseudo code) 就可以了。

Question:

有關於PL HW3 的 Exercise 5.4 (p. 124).

我照著課本打下

datatype 'a tree = LEAF of 'a | NODE of 'a tree * 'a tree;

可是當我打下 val tree1 = (NODE(NODE(LEAF 1, LEAF 2), LEAF 3));

evaluate 的結果不是 val teee1 = NODE(NODE(LEAF 1, LEAF 2), LEAF 3) : int tree

而是 val tree1 = NODE (NODE (LEAF #,LEAF #),LEAF 3) : int tree

請問 # 是什麼呢?? 又為甚麼會這樣 @_@?

Answer:

這之前在課程網站上,有作一些說明:

Question:

    如何讓 SML/NJ 於執行時,輸出詳細的資訊(例如說:很長的串列或是很深的資料結構)?

Answer:

    可以在程式的最前頭加上以下三行,讓編譯器列印多一點資訊:

    val _ = Control.Print.printDepth  := 1000000
    val _ = Control.Print.printLength := 1000000
    val _ = Control.Print.stringDepth := 1000000

Question:

最後是一個跟作業比較無關的問題

就是在 ML 中, 'a 代表的是 generic type

可是我在寫程式的過程中, 有時後會出現 ''a

請問 ''a 所代表的意思是?? 

Answer:

''a 形式的型態變數只能替換為支援「等同」(equality) 運算的型態如
int, bool, 或是 int list 等型態,但不能替換為不支援「等同」(equality) 運算的型態如
real, int -> int, 或是 real * bool 等型態。這部份你可以參考 Riccardo Pucella 所寫的
"Notes on Programming Standard ML of New Jersey" 38 頁起 2.9 Equality 的章節。

Valid XHTML 1.0 Strict