我仍然與我的設計和實現奮力內置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
。由於它涉及幾個並行模塊的類型,我的主要問題是我應該在哪些模塊中定義它們。
在上面的代碼,作爲一個嘗試,我在ViDbmFun
和g
在AMatrixFun
實施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
可以AreaMmmFun
比MmmArray.t
其他被迫AMatrixArray
東西...有沒有辦法解決呢?
同樣,我認爲主要的問題是在哪裏定義f
和g
,有沒有人可以幫忙?
您的示例中缺少模塊'Mmt'。 – nlucaroni 2012-02-01 20:49:21
對不起,應該是'嗯',我已經修好了...... – SoftTimur 2012-02-01 20:56:57