【问题标题】:How do you manipulate a list of tuples in SML?如何在 SML 中操作元组列表?
【发布时间】:2014-06-24 19:52:50
【问题描述】:

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

x::xs => #1(x)

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

【问题讨论】:

    标签: sml


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我会这样提取它:

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

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        将返回"abc"

        【讨论】:

          【解决方案4】:

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

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

          如果你有清单:

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

          然后,您可以通过以下方式提取第一个元组 (hd) 的名称:

          getname(hd lst)
          

          将返回"abc"

          【讨论】:

            猜你喜欢
            • 2021-01-20
            • 1970-01-01
            • 2018-03-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-08-24
            • 1970-01-01
            相关资源
            最近更新 更多