我找到你的功能了
run1
迄今为止可读性最高的一个。
删除某些代码重复的一种可能是使run1递归。
首先,可以定义一个简短的助手函数来从级别输出中提取数据
let proj (type a) (x:a level_output): a =
match x with
| FirstO x -> x
| SecondO x -> x
| ThirdO x -> x;;
那么运行的递归变量可以写为
let rec run: type a. a run_level_g -> 'b -> a level_output =
fun level data -> match level with
| First -> FirstO(first data)
| Second -> SecondO(second @@ proj @@ run First data)
| Third -> ThirdO(third @@ proj @@ run Second data);;