我正在编写函数来返回列表的最大值和最小值
由于除了一个函数调用之外代码是相同的,我试图不重复代码
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 引用自己不是很好的风格
关于如何改进代码的任何建议?
我正在编写函数来返回列表的最大值和最小值
由于除了一个函数调用之外代码是相同的,我试图不重复代码
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 引用自己不是很好的风格
关于如何改进代码的任何建议?
请注意,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 。还有更有效的方法可以做到这一点,特别是通过使您的函数尾递归。这总是一个很好的练习!