2011-05-29 83 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