如何从SML中的日期列表中获取最早的日期?

如何从SML中的日期列表中获取最早的日期?,sml,Sml,我在这项任务上遇到了一些麻烦。这就是教授的要求: 编写一个函数,该函数接受日期列表并计算为 (int*int*int)选项。如果列表没有日期,则其计算结果为无 如果日期d是列表中最早的日期,则为d 我知道如何创建函数,并对如何使用日期列表有一些想法,但我不知道如何“存储”最早的值以将其与日期列表的尾部进行比较。这是我提交的(它不起作用,它总是检索第一个日期,但我真的很想知道答案) 在递归调用中保持值的一种方法是在参数中传递值。由于您无法更改原始函数,因此最常用的解决方案是使用一个helper函数

我在这项任务上遇到了一些麻烦。这就是教授的要求:

编写一个函数,该函数接受日期列表并计算为
(int*int*int)
选项。如果列表没有日期,则其计算结果为无 如果日期d是列表中最早的日期,则为d

我知道如何创建函数,并对如何使用日期列表有一些想法,但我不知道如何“存储”最早的值以将其与日期列表的尾部进行比较。这是我提交的(它不起作用,它总是检索第一个日期,但我真的很想知道答案)


在递归调用中保持值的一种方法是在参数中传递值。由于您无法更改原始函数,因此最常用的解决方案是使用一个helper函数,该函数接受此额外参数,也可能接受其他参数。
这样的助手函数可以使用列表尾部递归调用中两个参数中最老的一个,将列表头与额外参数进行比较。当列表为空时,您只需返回这个额外的参数,因为它必须是最早的参数

fun oldestOfTwo (d1, d2) = (* return the oldest/minimum of the two dates *)

fun oldest [] = NONE
  | oldest (d::ds) =
    let
      fun oldest' max [] = SOME max
        | oldest' max (d::ds) =
          oldest (oldestOfTwo (max, d2)) ds
    in
      oldest' d ds
    end
fun oldest [] = NONE
  | oldest [d] = SOME d
  | oldest (d1 :: d2 :: ds) = oldest (oldestOfTwo (d1, d2) :: ds)
另一种解决方案是去掉列表的前两个元素,放回其中最早的一个,因此在每次递归调用中删除列表中的一个元素,并且在某个时刻列表中只有一个元素,它必须是最早的

fun oldestOfTwo (d1, d2) = (* return the oldest/minimum of the two dates *)

fun oldest [] = NONE
  | oldest (d::ds) =
    let
      fun oldest' max [] = SOME max
        | oldest' max (d::ds) =
          oldest (oldestOfTwo (max, d2)) ds
    in
      oldest' d ds
    end
fun oldest [] = NONE
  | oldest [d] = SOME d
  | oldest (d1 :: d2 :: ds) = oldest (oldestOfTwo (d1, d2) :: ds)

我发现您的
最旧的
函数有错误-
错误:未绑定变量或构造函数:d2
错误:运算符和操作数不一致[tycon不匹配]
。我通过重命名模式中的变量并将函数调用从
oldestOfTwo(max,d2))ds
重命名为
oldestOfTwo(max,d))ds
来修复它。感谢您提供这些简洁优雅的替代解决方案!:)