2014-09-24 50 views
0

我必須編寫一個關於檢查元素e是否屬於列表L然後返回true的程序。 我不喜歡使用if,所以我嘗試使用模式匹配。在EQUALOP發現SML語法錯誤

我寫這篇文章的代碼:

member (e, []) = false 
    |member (e, h=e::rest) = true 
    |member (e, h::rest) = member (e, rest); 

,我得到'在EQUALOP發現語法錯誤'。 任何人都可以解釋我必須改變嗎?

回答

1

不能使用=(或任何其它運營商或功能)中的圖案。

您需要使用(e, h::rest)模式,然後使用if e = h then ... else ...來檢查它們是否相等。

0

這將是更接近有效語法:

fun member (e, []) = false 
    |member (e, h as (e::rest)) = true 
    |member (e, h::rest) = member (e, rest); 

注意「H爲...」。

仍然是錯誤的「E」被複制在第二圖案,這是不允許的。

這是語法正確:

fun member (e, []) = false 
    |member (e, h as (e2::rest)) = true 
    |member (e, h::rest) = member (e, rest); 

但仍然沒有邏輯正確。正如塞巴斯蒂安提到的那樣,爲了您的意圖,第二種模式member (e, h as (e2::rest))最好寫爲member (e, h::rest),這與第三種模式相同,因此更好地刪除以僅保留三種模式中的兩種模式。

我必須寫一個程序有關檢查如果 元素e屬於列表L

除了原有的語法錯誤,你不能檢查e是在列表中,用模式,如在模式中,變量不像常量那樣被解釋。在模式中,只有常數代表它們的值,相反,變量將被分配解構值。防爆。你可以檢查是否存在類似truefalse,這將代表他們自己的,但不是一個變量(這是如何定義SML)。即使您只想使用模式,也需要使用if … then … else

出於好奇,您可能會對假想的sML(Successor ML)感興趣,它想要保護模式匹配:Match guards (successor-ml.org)