2012-02-01 65 views
0

我仍然與我的設計和實現奮力內置2個並聯模塊,以爲它的進展......定義功能在函子

首先,我已經定義了2個基本特徵和2個模塊:

module type MATRIX = sig type 'a t end  
module MatrixArray: MATRIX = struct 
    type 'a t = 'a array array 
end 

module type MMM = sig type 'a t end 
module MmmArray: MMM = struct 
    type 'a t = 'a array array 
end 

然後我定義了3個簽名,3函子與施加將它們與基本模塊以上:

module type AMATRIX = sig 
    include MATRIX 
    module Mmm : MMM 
    module Matrix: MATRIX 
    val g: 'a Mmm.t -> 'a Matrix.t -> 'a Mmm.t * 'a Matrix.t 
end 
module AMatrixFun (Mmm: MMM) (Matrix: MATRIX) : AMATRIX with module Mmm = Mmm and module Matrix = Matrix = struct 
    include MatrixArray 
    module Mmm = Mmm 
    module Matrix = Matrix 
    let g (mmm: 'a Mmm.t) (dbm: 'a Matrix.t) : 'a Mmm.t * 'a Matrix.t = failwith "to do" 
end 
module AMatrixArray = AMatrixFun(MmmArray)(MatrixArray) 

module type VIDBM = sig 
    module Matrix: MATRIX 
    type t = | Dtop | Dbot | D of int Matrix.t 
end 
module ViDbmFun (Matrix: MATRIX) : VIDBM with module Matrix = Matrix = struct 
    module Matrix = Matrix 
    type t = | Dtop | Dbot | D of int Matrix.t 
end 
module ViDbmArray = ViDbmFun(MatrixArray) 

module type AREAMMM = sig 
    module Mmm: MMM 
    type t = | Mtop | Mbot | M of int Mmm.t 
end 
module AreaMmmFun (Mmm: MMM) : AREAMMM with module Mmm = Mmm = struct 
    module Mmm = Mmm 
    type t = | Mtop | Mbot | M of int Mmm.t 
    let f (am: t) (vd: ViDbmArray.t) : t * ViDbmArray.t = 
    let (M mmm), (ViDbmArray.D dbm) = am, vd in 
    (AMatrixArray.g mmm dbm); 
    failwith "to do" 
end 
module AreaMmmArray = AreaMmmFun(MmmArray) 

實際上我需要定義一個函數f: AreaMmmArray.t -> ViDbmArray.t -> AreaMmmArray.t * ViDbmArray.t其需要另一個功能g: 'a Mmm.t -> 'a Matrix.t -> 'a Mmm.t * 'a Matrix.t。由於它涉及幾個並行模塊的類型,我的主要問題是我應該在哪些模塊中定義它們。

在上面的代碼,作爲一個嘗試,我在ViDbmFungAMatrixFun實施f。編譯停在(AMatrixArray.g mmm dbm);,給我:

Error: This expression has type int Mmm.t = int Mmm.t 
     but an expression was expected of type 
     'a AMatrixArray.Mmm.t = 'a MmmArray.t 

我認爲錯誤是合理的,因爲在int Mmm.t可以AreaMmmFunMmmArray.t其他被迫AMatrixArray東西...有沒有辦法解決呢?

同樣,我認爲主要的問題是在哪裏定義fg,有沒有人可以幫忙?

+0

您的示例中缺少模塊'Mmt'。 – nlucaroni 2012-02-01 20:49:21

+0

對不起,應該是'嗯',我已經修好了...... – SoftTimur 2012-02-01 20:56:57

回答

0

我會說你確實沒有達到正確的定義水平。 MatrixMmm是獨立的,並放在一起做一個AMatrix. Here you try to define a function that speaks about both矩陣andin a FooMmmFun functor, which only knows about, not矩陣; using the particular instance MatrixArray`是解決不了問題,你會得到一個類型錯誤試圖做到這一點。

你必須要在它知道這兩個Matrix(或ViDbm)和Mmm(或AreaMmm)的水平來定義f。這是我的建議,在申請AREAMMM簽名後添加到您的代碼中。它大多爲AMatrix定義了一個函數化圖層,就像您爲MatrixMMM所做的那樣。 PS:你可以爲頂部/底部關閉的類型定義參數類型,以避免構造函數名稱的重複。任何模塊外:

type 'a order = Top | Bot | D of 'a 

然後你就可以定義爲VIDBM.tint Matrix.t order,並AREAMMM.tint Mmm.t order,而不是有兩個不兼容的類型和構造的家庭(MtopDtop ...)。

1

我不確定你想達到什麼目的,但正如你所說,指的是AreaMmm函數中的具體AMatrix實例沒有意義。只有兩種解決方案:您需要通過AMATRIX with module Mmm = Mmm的實例參數化AreaMmm仿函數,或者您必須在仿函數內部構造一個合適的實例。