Functional programming 在标准ML列表中查找中间元素

Functional programming 在标准ML列表中查找中间元素,functional-programming,sml,smlnj,Functional Programming,Sml,Smlnj,我试图在SML中找到列表的中间元素,而不使用表单list.whatever的任何预实现函数。我可以使用一个函数,它获取两个相同的列表,递归地调用自己,从一个列表中删除一个项目,从另一个列表中删除两个项目,直到第二个列表为空。第一个列表的头将是原始列表的中间元素。我是SML新手,无法找到从列表中删除第一项或列表中删除前两项的方法。任何帮助都会很好。您可以使用来确定列表的形状并命名其组件: fun middle xs = let fun middle_rec (_ :: []) (x

我试图在SML中找到列表的中间元素,而不使用表单list.whatever的任何预实现函数。我可以使用一个函数,它获取两个相同的列表,递归地调用自己,从一个列表中删除一个项目,从另一个列表中删除两个项目,直到第二个列表为空。第一个列表的头将是原始列表的中间元素。我是SML新手,无法找到从列表中删除第一项或列表中删除前两项的方法。任何帮助都会很好。

您可以使用来确定列表的形状并命名其组件:

fun middle xs = let
  fun middle_rec (_ :: [])      (x :: _)  = SOME x
    | middle_rec (_ :: _ :: []) (x :: _)  = SOME x
    | middle_rec (_ :: _ :: xs) (_ :: ys) = middle_rec xs ys
    | middle_rec _              _         = NONE
  in middle_rec xs xs
end
以下是SML/NJ解释器的一些示例输出:

- middle ([] : int list);
val it = NONE : int list

- middle [1];
val it = SOME 1 : int list

- middle [1,2];
val it = SOME 1 : int list

- middle [1,2,3,4,5,6,7];
val it = SOME 4 : int list

- middle [1,2,3,4,5,6,7,8];
val it = SOME 4 : int list