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中的本地环境吗?
答案 0 :(得分:1)
您过度复杂了这一点,并且不清楚f
和getlast
的目的是什么,因为您从未使用过它们(而且&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& #34; f
的定义"是语法错误)。
如果您在此功能之外测试getlast
(这通常是一个好主意),您会注意到getlast []
是SOME []
而getlast [1,2,3]
是{ {1}};无论你传递给SOME [1,2,3]
什么getlast y
,SOME 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
答案 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>