List 从SML中的列表中提取元素

List 从SML中的列表中提取元素,list,sml,List,Sml,我试图从列表中提取给定的元素,但是我得到了一个匹配异常 目标是使我的函数表现为: fun extract [#"a",#"b",#"c"] [0,1,0] = [#"a",#"b",#"a"]; 我试着这样做: fun extract [] _ = [] | extract xr (y::yr) = List.nth(xr, y) :: extract xr yr; 但正如我所说,我得到了一个 ! Uncaught exception: ! Match 有什么想法吗? 也许我还可以使

我试图从列表中提取给定的元素,但是我得到了一个匹配异常

目标是使我的函数表现为:

fun extract [#"a",#"b",#"c"] [0,1,0] = [#"a",#"b",#"a"];
我试着这样做:

fun extract [] _ = []
  | extract xr (y::yr) = List.nth(xr, y) :: extract xr yr;
但正如我所说,我得到了一个

! Uncaught exception: 
! Match
有什么想法吗? 也许我还可以使用更多的列表函数?
我已经开始讨论curry函数,它应该将函数转换为高阶函数,但我真的不知道它是如何工作的?

出现匹配错误的原因是第二个列表不为空,但第一个列表不为空(除非第一个列表开始时为空,因为只有第二个列表变短,否则这种情况将始终发生)

基本上,您可以将第一行更改为
fun extract[]=[]
,这样就可以了

是的,您也可以使用高阶函数来解决这个问题。您可以使用
curry
List.nth
转换为
'a List->int->'a
类型的函数,而不是
'a List*int->'a
。然后您可以将该函数部分应用于
xr
,从而将其转换为
int->'a,当给定一个数字
i
时,它将返回
i
xr
的第个列表。然后,您可以使用
list.map
将函数应用于给定索引列表中的每个数字。因此,函数变为:

fun extract xr yr = List.map (curry List.nth xr) yr

但是你的想法很好,所以你应该坚持下去。

sepp2k-啊,该死的,愚蠢的错误。非常感谢你的帮助。是的,我也在考虑这些问题,有地图和列表。n,但我可以改变主意。非常感谢!