从SML中的列表中提取元素

时间:2010-11-02 11:24:47

标签: 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

有什么想法吗? 也许还有一些我可以使用的List函数吗? 我已经了解了咖喱功能,它应该将功能转换为更高阶的功能,但我真的不知道它是如何工作的?

1 个答案:

答案 0 :(得分:1)

你得到一个匹配错误的原因是没有第二个列表为空的情况,但第一个不是(除非第一个列表为空,因为只有第二个列表变短,所以总会发生这种情况) )。

基本上你可以将第一行更改为fun extract _ [] = [],它会起作用。

是的,您也可以使用高阶函数来解决这个问题。您可以使用curryList.nth转换为'a list -> int -> 'a类型的函数,而不是'a list * int -> 'a。然后,您可以将该函数部分应用于xr,这会将其转换为int -> 'a类型的函数,当给定数字时i会返回xr i列表List.map {1}}。然后,您可以使用fun extract xr yr = List.map (curry List.nth xr) yr 将函数应用于您给出的索引列表中的每个数字。因此功能变为:

{{1}}

但是你提出的工作正常,所以你应该坚持下去。