2015-11-03 88 views
2

如何在OCaml中定義未初始化的數組?OCaml中未初始化的數組

我嘗試這樣做是這樣的:

let arr = Array.make_matrix 2 2 

Error: The type of this expression, '_a -> '_a array array, 
     contains type variables that cannot be generalized 

我當然可以通過自動補0矩陣但後來我有一個類型的問題,因爲我想在這個陣列輸入和輸出通道存儲(IC和oc)兩個不同的用戶:

let fd, _ = conn in 
let ic = Lwt_io.of_fd Lwt_io.Input fd in 
let oc = Lwt_io.of_fd Lwt_io.Output fd in 

請告訴我,我該如何填充這樣的數組?

嘗試使用答案。

let ic1 = ref None 
... 
ic1 := ic; 

Error: This expression has type Lwt_io.input Lwt_io.channel 
     but an expression was expected of type 'a option 

let arr = Array.make_matrix 2 2 None 
... 
arr.(0).(0) <- ic; 

Error: This expression has type Lwt_io.input Lwt_io.channel 
     but an expression was expected of type 'a option 
+0

如果它是一個通道數組,那麼當您訪問某個元素時,您必須獲得一個通道。訪問此類未初始化數組的元素時,您將獲得什麼渠道? – newacct

+0

我已經寫了一個正確的方式來使用選項類型。你的代碼是不一樣的。 – camlspotter

回答

5

在OCaml中,你不能建立與它的元素初始化數組。您必須使用稍後將要填寫的相同類型的某個默認值來初始化它們。

我對Lwt_io不熟悉,不確定是否有可用作默認值的通道值。一般情況下,如果難以建立某種類型的默認值t,則可以使用t option而不是t作爲陣列元素的類型,並填寫None,運行時檢查的代價爲SomeNone

如果可以使用,然後虛擬通道值,

let arr = Array.make_matrix 2 2 dummy_channel 
arr.[0].[0] <- ch 

,但我不知道,你可以使用這樣的虛值Lwt_io。否則,

let arr = Array.make_matrix 2 2 None 
arr.[0].[0] <- Some ch 

順便說一句,輸入通道和輸出通道具有不同的類型,因此無法推送它們變成一個陣列。可能你應該在這裏使用幾個'mode channel ref的引用,而不是一個數組。

let ichan = ref None 
ichan := Some ich 
let ochan = ref None 
ochan := Some och 

這是不是很清楚爲什麼提問者想要在這裏可變性。可能正確的答案是根本不使用它們。

+0

謝謝你的回答/按順序理解你的想法,但我的OCaml知識並不深入。我如何填寫將包含頻道的參考文獻或數組?一些例子,如果你不復雜。 – Dzega

+0

我擴展了我的答案,但可能你應該認爲你確實需要數組或可變性...... – camlspotter

+0

描述使用你的變體的attepmts。你寫這裏是不正確的使用變異或數組。那麼,我可以用什麼來代替這個?我需要在通過telnet連接到PVP遊戲井字遊戲的兩個用戶之間切換。 – Dzega