2011-05-29 82 views
-2

我想要SML列表中的最后一个值。SML - 列表中的最后一个

例如,1::2::3 => 3

我尝试使用 “最后一次”,但没有奏效。

我试图实现它,就像这样:

val rec last = 
    fn (h::list) => last (list) 
     | (h::nil) => h 
     | (nil) => nil; 

但它给我的问题:匹配冗余。

谢谢你的帮助。

回答

2

我怀疑(h::nil)的情况是多余的,因为它是(h::list)的特殊情况。我想你应该重新安排你的对手的情况:

exception Empty 
    val rec last = 
     fn (h::nil) => h 
      |(h::list) => last (list) 
      | (nil) => raise Empty; 

顺便说一句,List.last应该工作,因为它是SML基本库的一部分。

+0

谢谢你,但它没有工作。它说运营商域应该得到'z list list,但我给他int列表。 – Tom 2011-05-29 19:55:08

+0

发生这种情况是因为当输入列表为零时没有任何返回。我已更新列表为空时引发异常的代码。 – pad 2011-05-29 20:07:35

+0

'List'是SML Basis Library的一部分,不仅仅是SML/NJ – newacct 2011-08-30 21:59:41

2

也可以做到一样容易为:

exception Empty 
fun lastinList [] = raise Empty 
| lastinList l = hd(rev(l)); 
+0

为什么要特殊处理'[]'? '最后一次xs = hd(rev xs)'就是一样好。 – 2012-02-29 21:54:50

+0

显然,在空列表中没有最后一项,这就是为什么我认为如果列表为空,应该引发错误。但正如你所说,简化代码同样好。 – Bernd 2012-03-03 23:30:15

+1

问题是,在这种情况下,'hd'会提高Empty。 ;) – 2012-03-04 18:46:39