2011-07-19 38 views
2

我已经定义了一些复杂的数据类型,例如:A型“信息”,以获得从功能的更多结果

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

我想定义的类似的目的,但不同类型的参数一些功能,为例:

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返回有用的分析信息。

这个结构看起来不是很常见,有谁能告诉我是否平常,或者如果有更好的方法可以实现同样的事情?

非常感谢您

回答

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 *) 

在后一种情况下,你将不得不match结果是否为Bad infoOk boolean

+0

感谢您的评论,为什么我无法在线或Ocaml手册中找到任何有关电池库或BatPervasives的文档? – SoftTimur

+0

'好'和'坏'是'BatPervasives'中的构造函数? – SoftTimur

+0

因为很难在网上找到:-) http://thelema.github.com/batteries-included/hdoc/是一个很好的开始。 –

相关问题