2013-11-04 112 views
1

我需要編寫一個函數,輸入類型(int * int) list並輸出整數對。這個功能應該利用另一個函數printGenList(需要一個函數f和一個列表L和適用f,列出的遞歸每一個元素),它的代碼,我這樣寫的 -遞歸函數漂亮地打印列表中的元素

fun printGenList f l = 
if NULL l 
then() 
else ((f (HD l)); printGenList (f) (TL l) ); 

,並提供一個匿名函數(FN ... => ...構造)將執行適當的漂亮打印。

回答

1

類型簽名告訴你有一個整數對列表。一對int的例子是(4,1)。一個列表對將然後是[(a,b),(c,d),...],而不是,如你試過,一對整數列表。

我相信你很熟悉(x::xs)表示法,因爲你似乎在某種程度上理解了列表。如果我們要匹配成對,我們可以這樣做:((n,m)::xs)。這種模式將綁定n和m到相應的int和xs到列表的其餘部分。然後遞歸很簡單:

fun pInts [] =() 
    | pInts ((n,m)::xs) = print ("("^Int.toString n^", " Int.toString m^")"; 
         pInts xs 

從這個來收集重要的是,你可以在一個單一的模式綁定幾個變量,並在你的函數中使用它們。你甚至可以,如果你確定你在列表中有一個以上的元素,同時結合幾個要素:

fun pairs []   = [] 
    | pairs [x]  = [] 
    | pairs (x::y::xs) = (x,y) :: pairs xs 
+0

thanx的幫助..清除了我的懷疑 –

1

你應該看看tuples 你確實有與下面的簽名定義功能:

fn : (int * int) list -> unit 

所以該函數將是這樣的:

fun pr(lst :(int * int) list) : unit = 
    case lst of 
     [] =>() 
     |(a,b) :: xs => let 
          val out = Int.toString a^Int.toString b 
         in 
          print(out); 
          pr xs 
         end 

我希望得到您的基本理念。嘗試改進打印格式!

+0

感謝名單了很多....那正是我想要的 –

+0

接受這個答案:-) – user987339