【问题标题】:What does (l+v) :: ...(list + integer :: (cons operand) ..) mean in SML?(l+v) :: ...(list + integer :: (cons operand) ..) 在 SML 中是什么意思?
【发布时间】:2021-06-04 09:30:47
【问题描述】:
- fun addto (l,v) =
= if null l then nil
= else hd l + v :: addto (tl l,v);
val addto = fn : int list * int -> int list

addto ([1,2,3],2);
val it = [3,4,5] : int list
- addto ([1,2,3],~2);
val it = [~1,0,1] : int list

这是我幻灯片中的 SML 函数。我不明白 (l+v) 如何在这里工作。 但它确实有效:

addto ([1,2,3],2);
val it = [3,4,5] : int list

我认为它是这样的:

   addto([1,2,3],2);  
   addto([2,3], 2);  
   addto([3], 2);   
   addto([],2)

现在它实际上是 l nill 所以它返回到 addto([3], 2);
但是hd l + v :: addto (tl l,v); 到底是什么意思? 我认为“缺点”运算符:: 必须定义为: ::
在这里,我的伪名称 实际上是带有 addto([1,2,3],2) 的示例中的整数。
但是在我的函数中,我们有短语 (l+v :: ..) 而 l 是一个列表,v 是一个 int 那么l+v 是什么?

p.s 我是个初学者,如果太简单了请见谅

【问题讨论】:

    标签: list sml smlnj


    【解决方案1】:

    第一个::定义为:

    datatype 'a list = nil | :: of 'a * 'a list
    

    因此,例如,1 :: [2, 3] 是列表 [1, 2, 3]

    然后在您的代码中,您的表达式被解释为:

    ((hd l) + v)) :: (addto (tl l,v))
    

    所以基本上,你的函数可以改写如下:

    fun addto (l,v) =
    if null l then nil  (*  if l is empty the result is the empty list  *)
    else let
      val head = hd l  (*  take the first element of list l  *)
      val sum = head + v  (*  then add it v  *)
      val result_tail = addto (tl l,v)  (*  and compute x + v for all x in the tail of my list  *)
    in
       sum :: result_tail  (*  the result is the sum I just computed followed by what the recursive call gave me  *)
    end
    

    最后,请注意,在大多数情况下,您不需要 nullhead 之类的函数,因为我们编写的函数具有模式匹配构造。这极大地增强了可读性,并且通常会抑制对此类功能的需求。例如,addto 可以更简单地改写为:

    fun addto ([], _) = []
      | addto (x :: tl, v) = (x + v) :: addto (tl, v)
    

    不是更简单吗?

    【讨论】:

    • 非常感谢!就是这样 (l+ v) 代表获取头部并将其添加到 v (所以两个整数).. 我有很长的路要走才能写出你写的最后一个函数.. 这是我第一次接触 sml !非常感谢
    猜你喜欢
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    • 2010-11-01
    • 2012-10-01
    • 2016-02-14
    • 2013-11-01
    • 2013-10-06
    • 2015-03-06
    相关资源
    最近更新 更多