2011-07-19 11 views
2

からより多くの結果を得るためにタイプ「情報」:私は、インスタンスのためのいくつかの複雑なデータ型、定義した関数

type drawer = 
    { ... 
    box: boxes list } 
type table = 
    { ... 
    drawers: drawer list } 
type room = 
    { ... 
    tables: table list } 

をそして、私は同様の目的の一部の機能を定義しますが、引数の異なる種類の、のためにしたいですexemple:

val compare_size_rooms: room -> room -> bool (* true: bigger, false: smaller *) 
val compare_size_tables: table -> table -> bool 
val compare_size_boxes: box -> box -> bool 

一つのことは、時には、原因の異なる構造に、2部屋/テーブル/ボックスは、比較にならないかもしれので、私はちょうど真または偽のほか、比較は私にいくつかの余分な情報を与えることを願っていることです。

私の質問は、それがタイプinfoを定義する一般的な方法であるかどうか、次のとおりです。

type info = 
    | Incomparable_Tables_One_foldable_Another_non_foldable 
    | Incomparable_Tables_One_rectangle_Another_triangle 
    | Incomparable_Boxes_One_in_paper_Another_in_metal 
    | ... 
そして、私は、次のような機能を作る:

val compare_size_rooms: room -> room -> bool * info (* true: bigger, false: smaller *) 
val compare_size_tables: table -> table -> bool * info 
val compare_size_boxes: box -> box -> bool * info 

これらの関数では、私は分析しているので2の値を比較すると、boolが大きいか小さいかを返します。そうでなければ、infoは分析の有益な情報を返します。

この構造はあまり一般的ではないようですが、誰かが普通のことを教えてもらえますか、それとももっと良い方法があれば同じことを実現できますか?

は、あなたが比較している2つのオブジェクトが比較できない場合、彼らが同等であったかのように、ブール値を返すことはお勧めできません非常に

答えて

1

、ありがとうございました。代わりに、例外を発生させることができます。

exception Incomparable_Tables_One_foldable_Another_non_foldable 

let compare_size_tables a b = 
    if comparable a b then 
    a.size < b.size (* Or whatever you do *) 
    else 
    raise Incomparable_Tables_One_foldable_Another_non_foldable 

(* val compare_size_tables : table -> table -> bool *) 

代替は(そうでないとき)ブール(オブジェクトが同等である場合)、または情報の種類のいずれかになりますバリアント戻り値の型を使用することです。例えば、バッテリーのライブラリ使用:後者の場合には

open BatPervasives 

type info = 
    | Incomparable_Tables_One_foldable_Another_non_foldable 
    | ... 

let compare_size_tables a b = 
    if comparable a b then 
    Ok (a.size < b.size) 
    else 
    Bad (Incomparable_Tables_One_foldable_Another_non_foldable) 

(* val compare_size_tables : table -> table -> (bool, info) BatStd.result *) 

を、あなたは結果がBad infoOk booleanであったかどうかmatchする必要があります。

+0

あなたのコメントをお寄せいただきありがとうございます。なぜ、私はBatteriesライブラリやBatPervasivesに関するドキュメントをオンラインまたはOcamlマニュアルで見つけることができませんでしたか? – SoftTimur

+0

'BatPervasives'の' OK'と 'Bad'もコンストラクタですか? – SoftTimur

+0

ウェブ上で見つけるのは難しいから:-) http://thelema.github.com/batteries-included/hdoc/はいい場所です。 –

関連する問題