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

Bre*_*eya 4 sml

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

x::xs => #1(x)
Run Code Online (Sandbox Code Playgroud)

但我一直得到"未解决的弹性记录".有什么建议?

new*_*cct 5

你遇到的错误是因为类似#1的东西是特殊的,它的类型取决于它的用途.例如,in #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"
Run Code Online (Sandbox Code Playgroud)

因为它只知道它是"某种列表",并且x是"某种类型的某种价值".但它不知道它是什么样的元组.

只需添加一个类型保护,或其他一些允许编译器告诉它是什么类型元组的上下文,它将起作用:

fun f (lst : (string * 'a) list) =
  case lst of x::xs => #1 x
            | [] => "The list is empty"
Run Code Online (Sandbox Code Playgroud)


Gnu*_*gen 5

我会像这样提取它:

fun foo ((x,y)::xs) = x;
Run Code Online (Sandbox Code Playgroud)

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

fun f [] = [] 
  | f ((x,y)::xs) = x ^ Int.toString(y) :: f(xs);
Run Code Online (Sandbox Code Playgroud)

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


sep*_*p2k 2

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

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

将返回"abc"