我正在尝试从列表中提取给定的元素,但是我得到了匹配异常?
目标是让我的功能表现得像:
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函数吗? 我已经了解了咖喱功能,它应该将功能转换为更高阶的功能,但我真的不知道它是如何工作的?
答案 0 :(得分:1)
你得到一个匹配错误的原因是没有第二个列表为空的情况,但第一个不是(除非第一个列表为空,因为只有第二个列表变短,所以总会发生这种情况) )。
基本上你可以将第一行更改为fun extract _ [] = []
,它会起作用。
是的,您也可以使用高阶函数来解决这个问题。您可以使用curry
将List.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}}
但是你提出的工作正常,所以你应该坚持下去。