我正在上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”将您的结果与之进行比较。请让我知道我是否错以及下一步去哪里!
答案 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
完成后将其“拆散”。 (我怀疑这就是您被困的原因。)