我是SML的新手,我想知道如何在元组列表中获取元素.例如,在列表中[("abc", 4), ("def", 6)],您如何提取"abc"?我试过了
x::xs => #1(x)
Run Code Online (Sandbox Code Playgroud)
但我一直得到"未解决的弹性记录".有什么建议?
你遇到的错误是因为类似#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)
我会像这样提取它:
fun foo ((x,y)::xs) = x;
Run Code Online (Sandbox Code Playgroud)
这样你提取列表中的元组和绑定x到abc和y到4,然后就返回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"]
您可以使用模式匹配来提取它。
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"。