首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SML -获取列表的索引

SML -获取列表的索引
EN

Stack Overflow用户
提问于 2014-10-30 18:20:06
回答 2查看 1K关注 0票数 2

我正在编写一个程序,该程序将“+”或“-”附加到列表的元素中,这取决于该元素的索引是奇数还是偶数(即交替和列表)。

但是,我很难确定每个元素的索引是什么。我认为应该使用if statementsmod附加正确的代码。

代码语言:javascript
复制
fun alternating([]) = 0
  | alternating(l) = 
        if List.nth(l,hd(l)) mod 2 == 0 then '+'@hd(l)@alternating(tl(l))
        else '-'@hd(l)@alternating(tl(l))

但是,List.nth(l,hd(l))总是在第二个索引处返回元素,而不是返回第一个索引。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-30 21:10:25

如果你真的想否定整数,这样你就可以把它们传递给某种求和,我会否定这个论点,如果它很奇怪的话。使用相互递归可以做到这一点,而无需任何明确的索引簿记:

代码语言:javascript
复制
fun alternate l =
   let
       fun alternate1 []      = []
         | alternate1 (x::xs) = (~x) :: alternate2 xs
       and alternate2 []      = []
         | alternate2 (x::xs) =   x  :: alternate1 xs
   in
       alternate1 l
   end

它的工作方式如下:

代码语言:javascript
复制
- alternate [1,2,3,4];
val it = [~1,2,~3,4] : int list

我强烈建议您使用模式匹配而不是hd

编辑讨论hd

根据经验,如果您需要hd,那么您可能也需要tlhd是一个部分函数--如果列表为空,它将抛出Empty。如果模式匹配,您可以方便地获得列表的头和尾的变量,然后直观地提醒您需要处理空列表。海事组织,更令人愉快的是:

代码语言:javascript
复制
fun foo []      = ...
  | foo (x::xs) = ...

超过等价物

代码语言:javascript
复制
fun foo l = 
  if null l 
    then ... 
    else (hd l) ... (tl l)

换句话说,您将得到更短、更干净的代码,并自动提醒其正确。赢/赢。据我所知,用另一种方式做这件事并没有什么明显的好处。当然,您可能会发现自己所处的情况是,您知道列表中至少有一个元素,并且您不需要做任何其他事情。你仍然需要考虑你所得到的案例,但这是一个很好的经验法则。

票数 2
EN

Stack Overflow用户

发布于 2014-10-30 20:58:14

如果您想用索引来修饰您的列表,您可以尝试如下所示

代码语言:javascript
复制
fun add_index l =
  let 
    fun add_index_helper (nil,  _) = nil
      | add_index_helper (h::tl,i) = (h,i) :: add_index_helper (tl,1+i)
  in
     add_index_helper (l,0)
  end

val x = add_index [0,1,4,9,16,25]

但是,您也可以使用相同的方法直接计算奇偶。

代码语言:javascript
复制
fun add_sign l =
  let 
    fun add_sign_helper (nil,  _) = nil
      | add_sign_helper (h::tl,i) = (h,i) :: add_sign_helper (tl,1-i)
  in
     add_sign_helper (l,0)
  end

val y = add_sign [0,1,4,9,16,25]

然后,您可以将奇偶映射到字符串。

代码语言:javascript
复制
fun sign_to_char (x,0) = (x,"+")
  | sign_to_char (x,_) = (x,"-")

val z = List.map sign_to_char y

或者您可以直接添加标志。

代码语言:javascript
复制
fun add_char l =
  let 
    fun add_char_helper (nil,  _) = nil
      | add_char_helper (h::tl,0) = (h,"+") :: add_char_helper (tl,1)
      | add_char_helper (h::tl,_) = (h,"-") :: add_char_helper (tl,0)
  in
     add_char_helper (l,0)
  end

val zz = add_char [0,1,4,9,16,25]

或者,如果您有一个字符串列表,并且您想要添加字符,您可以尝试这样的方法

代码语言:javascript
复制
fun signs L =
  let
    datatype parity = even | odd
    fun signs_helper ( nil ,_) = nil
      | signs_helper (x::xs,even) = ("+" ^ x) :: signs_helper(xs,odd)
      | signs_helper (x::xs,odd)  = ("-" ^ x) :: signs_helper(xs,even)
  in
    signs_helper (L,even)
  end

val z = signs ["x","2y","3z","4"]
(* this gives you val z = ["+x","-2y","+3z","-4"] : string list *)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26660505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档