我需要填写生成随机表达式的函数构建的实现。该函数的类型为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()
,如果没有其他匹配项,则只是默认情况。我认为我没有正确使用随机,因为我的匹配给我一个语法错误。关于我做错了什么的想法?