【问题标题】:Given a list create a list of tuples SML给定一个列表,创建一个元组列表 SML
【发布时间】:2020-08-16 00:07:27
【问题描述】:

您好,我是 Sml/nj 的新手,我正在尝试修改输入以将其提供给函数。我一直在修改输入。

具体来说,我读取输入并将其存储在列表中。我想创建一个给定偶数长度列表的函数,它将创建一个新列表,但使用 2 元素元组。
例如,如果我的输入是列表[2, 7, 4, 6, 5, 8],我想创建这个列表[(2, 7), (4, 6), (5, 8)]

我试过了,但不幸的是它不起作用:

fun maketuples [] = []
  | maketuples x::xs = (x, hd xs) @ makektuples (tl xs)

【问题讨论】:

    标签: functional-programming sml smlnj ml


    【解决方案1】:

    这里有几件事:

    • 如果您将构造函数的模式匹配作为函数参数,则需要在其周围加上括号,以便按照您想要的方式对其进行解析,即x::xs -> (x::xs)

    • 您在第二个子句中有错字(makektuples; extra k)

    • 您在 int * int(int * int) list 上使用附加 (@)。这个函数的域实际上是'a list * 'a list,即它的两个参数必须是相同类型的列表。

    我们可以这样修改:

    fun maketuples [] = []
      | maketuples (x::xs) = [(x, hd xs)] @ maketuples (tl xs)
    

    但是单例追加并不是你应该做的事情。为什么?使用 cons 更简洁:

    fun maketuples [] = []
      | maketuples (x::xs) = (x, hd xs) :: maketuples (tl xs)
    

    我们可以通过删除对hdtl 的调用来进一步清理这个问题,只需在函数参数中进一步破坏即可

    fun maketuples [] = []
      | maketuples (x::y::xs) = (x, y) :: maketuples xs
    

    你也许可以更好地处理错误(一种可能性是有例外):

    fun maketuples [] = []
      | maketuples (x::y::xs) = (x, y) :: maketuples xs
      | maketuples _ = raise Fail "Not an even length list"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-15
      • 1970-01-01
      • 1970-01-01
      • 2020-02-27
      • 2015-08-24
      • 1970-01-01
      • 2020-10-15
      相关资源
      最近更新 更多