6

我是 SML 的新手,我想知道如何在元组列表中获取元素。例如,在列表中[("abc", 4), ("def", 6)],您如何提取"abc"?我试过了

x::xs => #1(x)

但我不断收到“未解决的弹性记录”。有什么建议么?

4

4 回答 4

6

您遇到的错误是因为类似#1的东西有点特殊,它的类型取决于它的用途。例如,在 中#1 (1,2),类型#1'a * 'b -> 'a; 而在 中#1 (1,2,3),类型#1'a * 'b * 'c -> 'a。没有这样的类型'a * ... -> 'a适用于所有事情,因此编译器必须能够确定它将使用的类型(基本上,元组中有多少元素)。

所以这不起作用:

fun f lst =
  case lst of x::xs => #1 x
            | [] => "The list is empty"

因为它只知道它是“某种列表”,并且x是“某种类型的某个值”。但它不知道它是什么样的元组。

只需添加一个类型保护,或其他一些允许编译器判断它是哪种元组的上下文,就可以了:

fun f (lst : (string * 'a) list) =
  case lst of x::xs => #1 x
            | [] => "The list is empty"
于 2010-09-21T04:16:58.150 回答
5

我会这样提取它:

fun foo ((x,y)::xs) = x;

这样您就可以从列表中提取元组并绑定xabcy4,然后返回x。像这样,您还可以合并元组并返回仅包含字符串的列表:

fun f [] = [] 
  | f ((x,y)::xs) = x ^ Int.toString(y) :: f(xs);

会,给定列表[("abc",4),(def",6)],返回列表["abc4","def6"]

于 2012-09-21T11:47:16.357 回答
2

您可以使用模式匹配来提取它。

let
  val lst = [("abc", 4), ("def", 6)]
in
  case lst of (str,_)::xs => str
              | [] => "The list is empty"
end

将返回"abc"

于 2010-09-21T03:38:37.357 回答
1

你可以有一个函数来获取一个元组值,比如:

fun getname(name:string, x:int) = name;

如果你有清单:

val lst = [("abc", 4), ("def", 6)]

然后,您可以通过执行以下操作提取第一个元组 (hd) 的名称:

getname(hd lst)

将返回"abc"

于 2012-08-14T14:48:38.607 回答