2012-01-02 22 views
2

定义的测量功能,操作员,我想定义一个操作l_op : A list * A list -> A list,其实施需要另算op : A * A -> A。鉴于a0: A,虽然所有a1 : Aop a0 a1总是返回结果为A,对于一些a1结果使得更有意义比其他a1OCaml中

直观l_op al0 al1需要的策略匹配,其中发现的一个al1有意义元件,关于op,对于al0每个元素。然后op的结果列表是l_op的结果。

所以我需要的意思措施。

一种可能的选择是,一个功能measure: A * A * A -> int可以定义。例如,measure a0 a1 (op a0 a1)给出从1到10的整数,它表示op a0 a1是如何有意义的。然后在l_op al0 al1的实施,为al0每个a0,我能找到a1这样measure a0 a1 (op a0 a1) >= measure a0 a1' (op a0 a1') for all a1' in al1。然后,我删除了两个列表a0a1,并匹配两个列表的其余部分...

另一种选择是,我改变一点点opop : A * A -> A * int其中整数代表当前操作如何有意义。然后在执行l_op al0 al1,对于a0的每个al0,我可以找到a1这样的for all a1' in al1, m1 >= m1' where (_, m1), (_, m1') = op a0 a1, op a0 a1'

第二选择的一个优点是,我们可以节省一些代码,因为我们可以计算测量,而这样做op a0 a1。缺点是我发现签名op : A * A -> A * intop : A * A -> A好看。

所以我的问题是:

1)没有为这种测量功能(它首先h可能)的常规词,但我已经忘记了,会有人提醒?

2)你认为int是一个很好的类型测量?也许我们可以为此定义一种类型......最传统的方式是什么?

3)我上面提到哪个选择更好?或者有没有人有更好的主意?

回答

2

没有为这种测量功能(它首先可能是H)的传统的话,

也许“启发式”?它来自古希腊语,用于“发现,发现”,并用于计算机科学,用来命名寻找“足够好”结果的方法,通常以更简单但几乎同样有效的方式逼近完美行为。这里真的很合适(除非你的“意义测量”实际上是一种启发式/近似),但是以'h'开始。

我会建议只是把你的测量称为“分数”或“重量”。

您认为int是一种很好的测量类型吗?也许我们可以为此定义一种类型......最传统的方式是什么?

取决于您的测量是如何定义的。结果需要多少结构(例如,您可能想要保持测量的正确性,需要更丰富的结构)?您在测量时使用什么样的操作?如果你只使用加法和常量,int是好的,如果你使用除法等,可能需要float。在所有情况下,您可能都需要一个可以比较的类型。

我想大多数情况下int都可以,否则你就可以相对容易地改变主意。如果您打算改变这一点,你可以用一个类型别名:

type measure = int 

这样,您就可以使用measure代替int在大部分代码,并且不需要事后全部替换。也就是说,在OCaml中,我们通常不会写出很多类型注释,这要归功于推理,所以在实践中,我不希望将您的输入选择的细节传播到很多代码中。

上面我提到哪个选择更好?或者有没有人有更好的主意?

我会选择第二种选择。我怀疑在“计算结果”的A -> A -> A操作和“计算结果含义”的A -> A -> int操作之间存在一些冗余。通过同时执行这两个操作(A -> A -> A * int),您可以重复使用相同的逻辑结构,从而使通信更加清晰(并且使用更少的代码)。相反,如果两种操作完全无关,您可以考虑有两个独立的操作员(但我仍然使用A -> A -> int进行评分;如果您需要获得结果来衡量含义,您仍然可以在内部调用第一个操作)。