0

我正在编写函数来返回列表的最大值和最小值

由于除了一个函数调用之外代码是相同的,我试图不重复代码

fun cur f f2 x=case x of
    []=>raise Empty
    |[x]=>x
    |x::xs=>f(x,f2(xs))
fun min x=cur Int.min min x
fun max x=cur Int.max max x

感觉在声明中让 min 引用自己不是很好的风格

关于如何改进代码的任何建议?

4

1 回答 1

0

请注意,fun默认情况下是递归的。因此,您是正确的,您不需要进行显式递归引用:

fun cur f x = case x of
    [] => raise Empty
  | [x] => x
  | x::xs => f(x, cur f xs)
fun min x = cur Int.min x
fun max x = cur Int.max x

这是折叠的一般情况。看看标准库中的foldr 和 foldl 。还有更有效的方法可以做到这一点,特别是通过使您的函数尾递归。这总是一个很好的练习!

于 2013-10-28T19:59:59.517 回答