The following is a function that I wrote as an assignment for my Language Design class that returns the middle element of an integer list.
fun middle lst = let fun reduceByTwo (,onelst) = hd(onelst) (*When our twolst is empty we are at the middle*) | reduceByTwo (twolst,) = 0 (*This should never happen*) | reduceByTwo (twolst, onelst) = if null twolst orelse null onelst then 0 else if tl(twolst) =  orelse tl(tl(twolst)) =  then hd(onelst) else reduceByTwo(tl(tl(twolst)),tl(onelst)); in if null lst then 0 else reduceByTwo(lst,lst) end;
The idea is that we send our helper function reduceByTwo, a tuple of lst and recurse until twolst is null. We reduce twolst by two elements every time so when it becomes null, that indicates we are at the halfway point of onelst and can simply return the head of onelst.
- middle[1,5,1,214,1,14,1,24,100,99,41,2,4,4565,7,76,34]; val it = 100 : int