2017-08-06 63 views
2

1)I有這種模塊型如何匹配的抽象數據類型的構造中OCAML

module type MOD_SIG = sig type t val min val max;; 

2)I創建基於上述

module MOD_UINT8 = struct 
    type t = int32 
    let min = Int32.of_int 0 
    let max = Int32.of_int 255 end;; 

module MOD_UINT32 = struct 
    type t = int64 
    let min = Int64.zero 
    let max = Int64.of_int 4294967295 end ;; 

3簽名兩個模塊)我創建一等模塊2

let uint_8 = (module MOD_UINT8:MOD_SIG);; 
let uint_32 = (module MOD_UINT32:MOD_SIG);; 

4)我想寫一個函數,接受第一類模塊作爲參數,並嘗試ma tch該模塊中的特定值是Int32還是Int64

let module M=(val m:MOD_SIG) in match M.t with 
    | Int32 -> "Int32" 
    | Int64 -> "Int64" 

我從@octachron才知道,那是不可能的。雖然我只是想提出這個問題來理解,如果可能有解決方法?

+0

請問您可以使用標記工具來突出顯示代碼塊嗎?因爲你的問題是完全不可讀的。 – soupault

+0

如果他們正確回答您的問題,請不要忘記接受答案,它可以讓人們知道這個問題已經解決。 – Lhooq

回答

2

好吧,也許你可以添加到您的模塊功能,告訴他們具體含義是什麼:

type pv = I8 | I32 | I64 

module type MOD_SIG = sig 
    type t 
    val min 
    val max 
    val which_pv : pv 
;; 

module MOD_UINT8 = struct 
    type t = int32 
    let min = Int32.of_int 0 
    let max = Int32.of_int 255 
    let which_pv = I8 
end;; 

module MOD_UINT32 = struct 
    type t = int64 
    let min = Int64.zero 
    let max = Int64.of_int 4294967295 
    let which_pv = I64 
end;; 

其實,有時你的功能取決於究竟是什麼類型t是而這也正是函子出現。比方說,你想要實現一個關於可以是整數,無符號整數,浮點數的模塊...在這種情況下,基本操作取決於確切的類型,函子會更好:

module type NSig = sig 
    type t 
    val zero : t 
    val one : t 
    val min : t 
    val max : t 
    val add : t -> t -> t 
    val mult : t -> t -> t 
end;; 

module MNumb (N : NSig) = struct 
    type t = N.t 
    let min = N.min 
    let max = N.max 
    let add = N.add 
    let mult = N.mult 
    let rec pow t n = 
    if n = 0 then N.one 
    else if n = 1 then t 
    else let tt = pow t (n/2) in 
     if n mod 2 = 0 then tt else mult t tt 
end;; 

正如你所看到的,創建pow我需要知道1如何表示和mult太多,但因爲pow不是基本功能,我在仿函數創建它。所以你只需要給函子的基本類型(int8,int32,int64,float,fraction ...)並將其提供給函數來創建更高級的函數。

+0

明白了。一般來說,你認爲一流模塊更好地完成這個或函數? –

+0

嗯,這取決於你想要做什麼,實際上。如果你的函數是特定於你選擇的類型的,我會說functor更好地完成這個。讓我更新我的答案,讓您瞭解我認爲的更好的解決方案。 – Lhooq

+0

所以基本上建議是具有UINT8,標記Uint16,UINT32,答:64包括 類型噸 VAL零:噸 VAL之一:t VAL分鐘:噸 VAL最大:噸 VAL添加:噸 - >噸 - >噸 val mult:t - > t - > t 並僅使用函子來爲上述模塊添加高級函數。 雖然我想要的其實是在每個模塊中都有上面的值和函數,並且沒有像pow這樣的高級函數。所以從這個角度來看,我可以假設仿函數是矯枉過正的,我應該簡單地使用自己的簽名和結構創建Uint8,Uint16,Uint32,Uint64,而不是利用仿函數? –