2015-12-20 76 views
-1

有關OCaml中馮Neumman自動機的一所學校的項目,我定義類型state作爲總和類型取值AliveDead,我也有一個類型generation這簡直是一個state array array類型重新定義和投

在一個函數中,我使用make_matrix生成一個state array array,默認值爲state。我想那個函數返回一個generation所以我的東西鑄造函數的返回值一樣

let myfoo args : generation = ... 

的問題是,ocaml的不wan't通過make_matrix投下產生state array array

當我操縱state array array這對我來說是一回事時,我該如何返回自動機?

我想讓ocaml的知道所有的state array array我操縱的類型的generation.

回答

1

你的問題有點難以理解。這裏有一些評論。

首先,OCaml在主流語言意義上沒有「類型轉換」。它是一種強類型語言,每種表達式都有一個完整的已知類型。當您指定某種表達式的類型時:

let f (x: int) (y: int) : int = x + y 

您提供的類型更像評論而非強制。它們大多是告訴讀者類型的東西,而不是編譯器。 (您可以使用這些批註一個類型,但是這是一個單獨的討論。)

其次,當你聲明一個類型是這樣的:

type generation = state array array 

名稱generation是隻爲一個代名詞請輸入state array array。換句話說,它不會創建一個新的類型。它只是爲現有類型創建一個較短的名稱。

所以,當OCaml顯示的類型必須在類型的所有可用名稱中進行選擇。有時它會採用更長的名稱(state array array),有時候會縮短(generation),具體取決於嘗試按照自己的意願進行的試探法。但有時它是錯的(不是關於類型,而是關於你想要的:-)。

+0

謝謝你,我知道這一點,但我就是不正確表達自己, 我稱之爲「投」是語言尚未清楚些抱歉的總濫用。 我告訴OCaml該函數需要返回一個'generation',但我需要一個技巧讓他看到'狀態數組'是'代'。 這是不是一個超級想法,因爲它是一個問題的根源,但它是主題的一部分,所以... –

1

除了傑弗裏回答一些意見,可以幫助你:

  1. 如果你註釋你的函數是這樣,let myfoo args : generation = ...和編譯器抱怨說,返回類型是不同的,那麼就意味着有是您的功能中的錯誤,它確實不會返回一代或state array array

  2. 沒有必要以某種方式證明一個編譯器,即state array array相同generation,因爲一旦你添加的形式type generation = state array array類型方程就知道這一點。這是一個公理。但請注意,=是自反的,因此對於編譯器而言,此等式意味着generationstate array array,反之,state array arraygeneration。所以它可以互換使用這種類型。

  3. 如果你想創建一個真正的新類型,而不是類型別名,那麼你需要定義新類型並使用它。你的情況,你可以如下定義一個新的類型:

    type generation = Gen of state array array 
    

    Gen將是一個構造函數,將採取state array array創造generation類型的值,如:

    let generation = Gen xs 
    

    哪裏xs是類型state array array的值。

+0

好吧抱歉,傢伙一切都是正確的,我忘記了,我改變了類型代?狀態數組數組的基因「,所以沒有構造函數就無法工作。 對不起,感謝大家。 –