【问题标题】:Extracting elements from list in SML从 SML 中的列表中提取元素
【发布时间】:2010-11-02 21:10:06
【问题描述】:

我正在尝试从列表中提取给定元素,但出现匹配异常?

目标是让我的函数表现得像:

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 函数? 我已经了解了 curry 函数,它应该将一个函数变成一个高阶函数,但我真的不知道它是如何工作的?

【问题讨论】:

    标签: list sml


    【解决方案1】:

    您收到匹配错误的原因是,当第二个列表为空时,没有任何情况,但第一个不是(除非第一个列表开始为空,否则总是会发生这种情况,因为只有第二个列表变短)。

    基本上你可以把第一行改成fun extract _ [] = []就行了。

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

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

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

    【讨论】:

    • sepp2k - 啊该死的,愚蠢的错误。非常感谢你的帮助。是的,我也在考虑这些方面,使用 map 和 List.nth,但我可以理解它。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 2013-12-18
    • 2023-01-28
    • 1970-01-01
    相关资源
    最近更新 更多