ML当地环境

时间:2017-02-26 20:18:20

标签: ml

ML函数将接受布尔函数和值列表并返回列表中符合给定条件的最后一个值,如果列表中没有值,则返回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中的本地环境吗?

2 个答案:

答案 0 :(得分:1)

您过度复杂了这一点,并且不清楚fgetlast的目的是什么,因为您从未使用过它们(而且&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& #34; f的定义"是语法错误)。

如果您在此功能之外测试getlast(这通常是一个好主意),您会注意到getlast []SOME []getlast [1,2,3]是{ {1}};无论你传递给SOME [1,2,3]什么getlast ySOME y都是y

此外,List.filter func L的结果是'a list,而不是'a option,因此它作为last的定义不是很有用。

在列表xs中查找此类元素的一种方法是使用显式递归:

  • 如果xs为空,则结果为NONE
  • 如果xs不为空,请先查看是否有"最后一个元素"在xs的尾部。
    如果有,那就是答案。
    如果没有,那么
    • funcxs的负责人有效,那是您的答案。
    • 否则,结果为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  

答案 1 :(得分:0)

为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>