2017-08-12 70 views
3

有沒有一種方法來模式匹配獨立於構造函數arity的構造函數?有時在模式匹配中,我只關心構造函數而不關心與之相關的數據。Ocaml模式匹配數據構造函數獨立於其構造

我擔心的是,當我在ADT中更改構造函數的構造函數時,我必須通過並更改所有模式匹配,即使丟棄所有「字段」(什麼是正確的術語?)數據構造函數。

假設我有多個構造

(* time * message *) 
type log_message = 
    Warning of float * string 
    | Error of float * string 

的ADT,我要檢查這種類型的值,而是隻關心構造我寫類似

let is_error_message x = match x with 
    | Warning _, _ -> false 
    | Error _, _ -> true 

如果後來我想回去添加嚴重性字段來警告,給我

type log_message = 
    Warning of float * string * int 
| Error of float * string 

我必須在is_error_message的模式中添加一個新的通配符來滿足類型檢查器。

let is_error_message x = match x with 
    | Warning _, _, _ -> false 
    | Error _, _ -> true 

回答

4

類型定義

type log_message = 
    | Warning of float * string 
    | Error of float * string 

意味着兩個構造函數(WarningError)不接受兩個參數,但其中的一個,而產物(即元組)。所以,你instatiate如下:

Warning (4.0, "you better be warned") 

當這種變異的一個實例進行模式匹配,你可以只使用_指定任意長度的元組(如果你不關心傳遞給構造函數的參數):

type log_message = 
    | Warning of float * string 
    | Error of float * string;; 

let is_error_message x = match x with 
    | Warning _ -> false 
    | Error _ -> true;; 

is_error_message (Warning (2.0, "totally not an error"));; 
- : bool = false 
+0

我想我的意思是說'(*浮動字符串)'&C ...用於多參數的構造函數,而不是一元的構造函數警告服用我搞砸語法的元組... (然後不知道爲什麼'Warning _ _'無效)。你所說的完全正確,但我不想只是靜靜地解決這個問題。 –

+1

這是不正確的,正則構造函數的參數不是元組。 '_'可以匹配多個參數的原因是因爲它已被添加爲一個功能來覆蓋此用例。 – gsg

+0

@gsg哪個版本加入了? –