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 的章節。