2017-02-26 24 views
0

ML的功能,将接受一个布尔函数和值的列表,并在满足特定条件或无如果列表中没有价值做返回列表中的最后一个值ML当地enviornment

我目前的函数看起来像这样的:

fun last func nil = NONE 
| last func L = 
    let val f = 
     fun getlast(x) = SOME x 
     | getlast(x::xs) = getlast xs 
    in List.filter func L 
    end; 

谁能帮我调试我的代码,同时也帮助我了解当地的环境,ML?

回答

1

你过于复杂了一点,目前还不清楚fgetlast的目的可能是什么,因为你从来没有使用它们(并且f的“定义”是语法错误)。

如果要测试getlast这个功能之外(这通常是一个好主意),你会发现,getlast []SOME []getlast [1,2,3]SOME [1,2,3]; getlast ySOME y无论你通过什么y

而且,List.filter func L结果是'a list,而不是一个'a option,所以它不是作为last的定义是非常有用的。在列表中找到xs这样的元素的

一种方法是使用明确的递归:

  • 如果xs是空的,结果是NONE
  • 如果xs不为空,请首先查看xs尾部是否有“最后一个元素”。
    如果有,那就是答案。
    如果没有,那么
    • 如果func持有为xs头,这就是你的答案。
    • 否则,结果为NONE

翻译这ML,它可能是这个样子:

fun last _ [] = NONE 
    | last f (x::xs) = case last f xs of 
         NONE => if f x then SOME x else NONE 
         | result => result 

如果你想使用List.filter和避免人工递归,然后记下列表的最后一个元素是该列表反向的第一个元素:

fun last f xs = case List.rev (List.filter f xs) of 
        [] => NONE 
        | y::ys => SOME y