2012-04-06 66 views
1
val implies = 
    fn x y = case x of false andalso case y of false => true 
    | fn x y = case x of false andalso case y of true => true 
    | fn x y = case x of true andalso case y of false => false 
    | fn x y = case x of true andalso case y of true => true; 

我不能得到這個編譯。我對SML相對比較陌生,所以不太瞭解一般的語言和語法。我做錯了什麼?爲什麼SML中的真/假隱含函數不起作用?

回答

7

有各種各樣的事情錯:

  • 沒有在implies沒有參數做圖案直接匹配。
  • case x of用於與特定值進行模式匹配,而不是像接受布爾表達式的if/else表達式。
  • lambda的語法應該以fn x => ...開頭。

甲快速修復:

fun implies x y = 
    case (x, y) of 
     (false, false) => true 
    | (false, true) => true 
    | (true, false) => false 
    | (true, true) => true 

這可以被改寫爲可讀性爲:

fun implies false false = true 
    | implies false true = true 
    | implies true false = false 
    | implies true true = true 

或通過使用命題邏輯規則更簡潔:

fun implies x y = (not x) orelse y 
+0

嘗試的第一個建議,這不是編譯。收到此錯誤: tut01.sml:20.1錯誤:語法錯誤: 在提出:與野生 未捕獲的異常編譯[ 「語法錯誤」 編譯]:更換BAR ../compiler/Parse/main/smlfile.sml :15.24-15.46 ../compiler/TopLevel/interact/evalloop.sml:44.55 ../compiler/TopLevel/interact/evalloop.sml:296.17-296.20 – Chucky 2012-04-06 14:12:55

+0

那麼,刪除第一個欄(見我的更新),因爲它是多餘的。 – pad 2012-04-06 14:15:13

+0

仍然收到編譯錯誤:( – Chucky 2012-04-06 17:07:03

4

關於匿名功能,

fun implies x y = (not x) orelse y 

可當你看到被寫成

val implies = fn x => fn y => (not x) orelse y 
但是

,它並沒有真正使任何意義,做這種方式(在這種特殊情況下)。

SML中的匿名函數只有一個參數。論據柯里工作,因爲fun關鍵字是語法糖(也稱爲派生形式)

val rec implies = fn x => fn y => 
    case (x, y) of 
     (x,y) => (not x) orelse y 

被使用的情況,因爲我們可以有在原有功能的一些模式匹配,然後將其直接轉化分解成這種情況以及rec是因爲原始函數可能是遞歸的。

因此第二個例子@pad了等價於:

val rec implies = fn x => fn y => 
    case (x, y) of 
     (false, false) => true 
    | (false, true) => true 
    | (true, false) => false 
    | (true, true) => true 
+0

+1用於澄清匿名函數。 – pad 2012-04-06 17:38:52

相關問題