【问题标题】:Returning pairs of lists in SML返回 SML 中的列表对
【发布时间】:2013-11-19 22:47:22
【问题描述】:

我想构建一个列表,列表中的所有元素都与给定列表的头部配对。到目前为止,代码如下。我不确定我在哪里弄错了。

 fun foo [[]] = [[],[]]
  | foo [[x]] = []
  | foo (x::y::ys) =(x,y)::foo(ys); 

我的签名应该是这样的

 ('a list) list ->('a list * 'a list) list

示例输出

foo [[2,3,4],[1,2],[6,7,8]] = [([2,3,4],[1,2]),([2,3,4],[6,7,8])]

【问题讨论】:

    标签: sml smlnj


    【解决方案1】:

    这个问题有一个更通用的版本,可能更清楚一点。我不会专门使用列表列表,而是使用更通用的类型来讨论这个问题:

    'a list -> ('a * 'a) list
    

    这包括您想要的签名('a list) list ->('a list * 'a list) list 作为特例。

    它现在分为三种情况:空列表、单个元素的列表以及任何其他列表。您不能将前两个元素配对,因此我们会将它们评估为一个空列表。剩下的案例是有趣的案例,看起来与您所拥有的相似。但是,由于您希望将列表的第一个元素与所有其他元素配对,因此当递归调用 foo 时,您需要将第一个元素放回列表中。最终结果如下所示:

    fun foo [] = []
      | foo [x] = []
      | foo (x::y::ys) = (x,y)::foo(x::ys)
    

    当使用时(在莫斯科 ML):

    - foo [[2,3,4], [1,2], [6,7,8]];
    > val it = [([2, 3, 4], [1, 2]), ([2, 3, 4], [6, 7, 8])] :
      (int list * int list) list
    

    【讨论】:

      【解决方案2】:

      做同样事情的更简洁的方式:

      fun foo [] = []
        | foo (x::xs) = map (fn y => (x,y)) xs
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-01
        • 2020-11-30
        相关资源
        最近更新 更多