需要创建一个函数构建函数

时间:2015-01-27 18:01:46

标签: ocaml

我需要填写生成随机表达式的函数构建的实现。该函数的类型为build:(int * int - > int)* int - > expr。使用参数对(rand,depth)调用该函数。

第一个元素rand是int * int - >类型的随机数生成器。 int。每个调用rand(i,j)返回i inclusive和j exclusive之间的随机整数。使用此函数在编写子表达式时随机选择运算符以构建更大的表达式。

第二个元素深度是最大嵌套深度。随机组成深度为d-1的子表达式构建的深度d的随机表达式,深度为0的唯一表达式为VarX或VarY。

该函数使用我创建的数据类型

type expr =
      VarX
    | VarY
    | Sine of expr
    | Cosine of expr
    | Average of expr * expr
    | Times of expr * expr
    | Thresh of expr * expr * expr * expr 

并称之为:

let buildX()                       = VarX
let buildY()                       = VarY
let buildSine(e)                   = Sine(e)
let buildCosine(e)                 = Cosine(e)
let buildAverage(e1,e2)            = Average(e1,e2)
let buildTimes(e1,e2)              = Times(e1,e2)
let buildThresh(e1,e2,e3,e4)       = Thresh (e1,e2,e3,e4)

构建它的每个部分 这就是函数的开始:

let rec build (rand,depth)

我假设我将随机数与构建匹配,就像这样的1-正弦2余弦3平均4次(不使用阈值)

let rec build (rand,depth) = match (rand(1,4),depth) with

并且基本上需要创建具有一定深度的随机表达式。它说我需要创建深度为-1的随机表达式,并使用深度= 0表示var x和var y但我真的不明白这个概念,也不确定我是否总是需要制作var x和var y或者只是需要其中一个。 任何有关如何处理此问题的帮助将不胜感激。

我创建了这个函数:

let rec build (rand,depth) = match (rand(1,8),depth) with 
|(_,0) -> if(rand(1,3) = 1) then buildX() else buildY()
|(1,_)-> buildX()
|(2,_)-> buildY()
|(3,_)-> buildSine(build(rand,(depth-1)))
|(4,_)-> buildCosine(build(rand,(depth-1)))
|(5,_)-> buildAverage(build(rand,(depth-1)),build(rand,(depth-1)))
|(6,_)-> buildTimes(build(rand,(depth-1)),build(rand,(depth-1)))
|(7,_)-> buildThresh(build(rand,(depth-1)),build(rand,(depth-1)),build(rand,(depth-1)),build(rand,(depth-1)))
|(_,_) -> buildX()
;;

我想要它做的是首先检查深度是否为零,然后是否随机选择1或2以及buildX或buildY,具体取决于它选择的深度。 如果深度不为零,我想匹配随机的结果(可能是从1到7),并且根据我得到的那个,我调用适当的表达式构建器。永远不应该执行(_,_) -> buildX(),如果没有其他匹配项,则只是默认情况。我认为我没有正确使用随机,因为我的匹配给我一个语法错误。关于我做错了什么的想法?

0 个答案:

没有答案