ツバメI持って次は、そのタイプ
最初と最後の名前を取得するためのメソッドを持つPerson
モジュールタイプ:name
機能をPerson
を拡張する
module type Person = sig
type t
val first : t -> string
val last : t -> string
end
PersonUtils
ファンクタを:
module PersonUtils (Person: Person) : sig
type t
val name : t -> string
end = struct
include Person
let name p = Person.first p^" "^Person.last p
end
とMain
モジュールは、次のように
module Main : sig
type t
val name : t -> string
end = struct
include PersonUtils(struct
type t = {
first: string;
last: string;
}
let first p = p.first
let last p = p.last
end)
end
、私は追加のloud_first_name
機能を追加したい:私は署名し、モジュールに次の行を追加します。
module Main : sig
type t
val name : t -> string
(* New *)
val loud_first_name : t -> string
end = struct
include PersonUtils(struct
type t = {
first: string;
last: string;
}
let first p = p.first
let last p = p.last
end)
(* New *)
let loud_first_name p = String.uppercase p.first
end
はしかし、loud_first_name
はもはや私の構造を知っていることを表示されませんt
と入力して、エラーUnbound record field first
が残っています。
私の質問は、どうすればloud_first_name
のようなメソッドを作成して、自分のレコードフィールドにアクセスできるようにすることができますか?私はt
型をレベルアップさせようとしましたが、私のファンクタの引数でそれを使うのは問題でした。
ありがとうございます!私は最後の例でシグネチャの不一致を取り除くことができました。しかし、 'type t = t_'を避ける方法はありますか?私がインラインで 't = {first:string; ...} '私の' loud_first_name'メソッドはまだそのフィールドを見ることができません。 –
'type nonrec t = t'を試すことができます。それは定義されているのではなく、範囲内の 't 'を参照します。 –
ありがとう@ÉtienneMillon!私はその構文について知らなかった。それでも、私が含むモジュールは、私の型 't'が重複するようにします(そして私はエラーメッセージを受け取ります)。おそらく私は 'include'を間違って使っていますか? –