如何在SML中操作元组列表?

如何在SML中操作元组列表?,sml,Sml,我是SML新手,我想知道如何在元组列表中获取元素。例如,在列表[(“abc”,4),(“def”,6)]中,如何提取“abc”?我试过了 x::xs => #1(x) 但我一直收到“未解决的flex记录”。有什么建议吗?您可以使用模式匹配将其提取出来 let val lst = [("abc", 4), ("def", 6)] in case lst of (str,_)::xs => str | [] => "The list is em

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

x::xs => #1(x)

但我一直收到“未解决的flex记录”。有什么建议吗?

您可以使用模式匹配将其提取出来

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

将返回
“abc”

您遇到的错误是因为像
#1
这样的东西有点特殊,它的类型取决于它的用途。例如,在
#1(1,2)
中,
#1
的类型是
'a*'b->'a
;而在
#1(1,2,3)
中,
#1
的类型是
'a*'b*'c->'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"

您可以使用一个获取元组值的函数,如:

fun getname(name:string, x:int) = name;
如果您有以下列表:

val lst = [("abc", 4), ("def", 6)]
然后,您可以通过执行以下操作提取第一个元组(hd)的名称:

getname(hd lst)

将返回“abc”

我将按如下方式提取它:

fun foo ((x,y)::xs) = x;
因此,您可以从列表中提取元组,并将
x
绑定到
abc
,将
y
绑定到
4
,然后返回
x
。这样,您还可以合并元组并返回仅包含字符串的列表:

fun f [] = [] 
  | f ((x,y)::xs) = x ^ Int.toString(y) :: f(xs);
给定列表
[(“abc”,4),(def),6)]
,返回列表
[“abc4”,“def6”]