使用特定的高阶辅助函数来计算阶乘

时间:2019-07-18 06:55:45

标签: sml

我正在上MOOC(不计学分)。分配的问题之一是使用一个遵循以下函数的阶乘函数:

(’a->’a)->(’a->bool)->’a->’a

我已经创建了该函数:

fun do_until (f, g) = fn x => case g(f x) of
              false => f x
            | _ => do_until(f,g) (f x);

但是我在使用do_until函数来实现阶乘时遇到了困难。

我认为解决方案应采用以下格式:

fun factorial x = (do_until (f, g)) x

我看到的问题是'g'函数只能验证结果,如果验证,则返回该结果。由于函数类型描述符有严格的限制,因此它限制了您将元组传递给g,然后验证掉部分元组并返回另一部分。即。 (阶乘,将int转换为多),然后g从#2进行验证并返回#1。不幸的是,类型阻止了这种情况。我开始认为使用do_until作为辅助函数是不可能的,除非您以其他方式计算阶乘,然后“ g”将您的结果与之进行比较。请让我知道我是否错以及下一步去哪里!

1 个答案:

答案 0 :(得分:0)

您输入了错误的类型–该函数应该被处理–如果为参数提供比“ f”和“ g”更多的描述性名称,您可能会遇到更多的运气:

fun do_until next done x = if done x 
                           then x
                           else do_until next done (next x) 

请注意,您可以将任何内容从factorial传递到do_until,例如保存您的计算状态的元组,然后在do_until完成后将其“拆散”。 (我怀疑这就是您被困的原因。)