你如何操纵SML中的元组列表?

时间:2010-09-20 20:56:08

标签: sml

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

x::xs => #1(x)

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

4 个答案:

答案 0 :(得分:5)

您遇到的错误是因为#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"

答案 1 :(得分:4)

我会像这样提取它:

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

以便从列表中提取元组并将x绑定到abcy绑定到4,然后返回x。这样你也可以合并元组并返回一个只有字符串的列表:

fun f [] = [] 
  | f ((x,y)::xs) = x ^ Int.toString(y) :: f(xs);
如果列表[("abc",4),(def",6)]

将返回列表["abc4","def6"]

答案 2 :(得分:2)

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

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

将返回"abc"

答案 3 :(得分:1)

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

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

如果您有列表:

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

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

getname(hd lst)

将返回"abc"