ML本地环境

ML local enviornment

ML 函数,它将接受一个布尔函数和一个值列表,return 列表中满足给定条件的最后一个值,或者 NONE 如果列表中没有值,则

我当前的函数如下所示:

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 中的本地环境吗?

你把这个复杂化了一点,不清楚 fgetlast 的目的是什么,因为你从未使用过它们(以及 "definition" 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的尾部有没有"last element"。
    如果有,那就是答案。
    如果没有,那么
    • 如果 xs 的头像 func 成立,那就是你的答案。
    • 否则,结果为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  

为 ML 或任何新项目创建您自己的环境

$ virtualenv -p python3 env (if you have 2.7,3.5)
$ virtualenv env(only you have 3.5+)

$ source env/bin/activate
$ pip install <packagename>