我必須編寫一個關於檢查元素e是否屬於列表L然後返回true的程序。 我不喜歡使用if,所以我嘗試使用模式匹配。在EQUALOP發現SML語法錯誤
我寫這篇文章的代碼:
member (e, []) = false
|member (e, h=e::rest) = true
|member (e, h::rest) = member (e, rest);
,我得到'在EQUALOP發現語法錯誤'。 任何人都可以解釋我必須改變嗎?
我必須編寫一個關於檢查元素e是否屬於列表L然後返回true的程序。 我不喜歡使用if,所以我嘗試使用模式匹配。在EQUALOP發現SML語法錯誤
我寫這篇文章的代碼:
member (e, []) = false
|member (e, h=e::rest) = true
|member (e, h::rest) = member (e, rest);
,我得到'在EQUALOP發現語法錯誤'。 任何人都可以解釋我必須改變嗎?
不能使用=
(或任何其它運營商或功能)中的圖案。
您需要使用(e, h::rest)
模式,然後使用if e = h then ... else ...
來檢查它們是否相等。
這將是更接近有效語法:
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
是在列表中,用模式,如在模式中,變量不像常量那樣被解釋。在模式中,只有常數代表它們的值,相反,變量將被分配解構值。防爆。你可以檢查是否存在類似true
或false
,這將代表他們自己的,但不是一個變量(這是如何定義SML)。即使您只想使用模式,也需要使用if … then … else
。
出於好奇,您可能會對假想的sML(Successor ML)感興趣,它想要保護模式匹配:Match guards (successor-ml.org)。