2017-10-08 152 views
0

的元組的列表搜索我是很新的SML/NJ和我種的丟失。我一直在努力實施是通過具有一定列出了它的元組的列表中去搜索功能,例如VAL X = [(5,2,[9,8,7]),(3,4,[ 6,5,0]),(11,12,[8,3,1])]。我想我的函數的元組的第一個元素添加到新的名單,一旦有我的目標數量和元組的元素3號之間的匹配。我嘗試了幾個實現,但目前爲止它們都沒有正常工作。SML/NJ列表

type id = int* int* int list; 
val b:id list = [(5,2,[9,8,7]), (3,4,[6,5,0]), (11, 12, [8,3,1])] 
val number: int = 8; 
val a: int list = nil; 

fun findNum(nil) = a | findNum (x: id list) = 
    let val tem = hd(x) 
     val theList = #3tem 
     val i = #1tem 
     fun findMatch(nil) = a | findMatch(tem) = 
      if (number = hd(theList)) then i::a 
      else findMatch (tl(theList)) 
    in findNum(tl(x)) 
    end; 

findNum(b); 

我知道這是寫得很差,這就是爲什麼它總是返回空列表。我覺得我需要做,而不是讓/在/結束,所以它會遞歸地調用列表中的其餘元組。我的問題是我不知道該怎麼做,因爲如果我使用if/else,那麼我不能在函數內聲明一些值。我很欣賞任何建議或提示。

謝謝

+0

你能添加輸入的一個簡單的例子,期望的輸出例如用於輸入'[(5,2,[9,8,7]),(3,4,[6,5,0]),(11, 12,[8,3,1])]'你期望輸出什麼? – coder

+0

我希望它返回記錄一次的第三個元素數量的第一元素列表都匹配。所以在這種情況下應該是[5,11]。 –

+0

非常感謝。 –

回答

1

你可能有功能member (x, xs)這是真的開始,如果x是列表xs一個元素:

fun member (x, xs) = List.exists (fn y => x = y) xs 

基本情況是當三元組列表是空的。然後x不會發生任何的(不存在)三元組的第三元件,並且結果的列表是空的。通過對列表的第一個元素是三元組(i,j,xs)和列表的尾部ts進行模式匹配,並且詢問x是否是第三個元素xs的成員來實現遞歸情況:如果是,則返回元組的第一部分,i

fun find (x, []) = [] 
    | find (x, (i,j,xs)::ts) = 
    if member (x, xs) 
    then i :: find (x, ts) 
    else find (x, ts) 

使用高順序列表中的較短的版本組合程序mapfilter

fun find (x, ts) = map #1 (filter (fn (i,j,xs) => member (x, xs)) ts) 
+0

非常感謝您的幫助和解釋。這個實現非常簡短和乾淨。 –

0

這是我實現了一些細微的變化:

type id = int* int* int list; 
val b:id list = [(5,2,[9,8,7]), (3,4,[6,5,0]), (11, 12, [8,3,1])] 
val number: int = 8; 

fun findNum [] = [] 
    | findNum (x::xs) = 
     let 
      val theList :int list = #3 (x :id) 
      val i : int = #1 x 
      fun findMatch [] = false 
      | findMatch (y::ys) = if (number = y) then true 
            else findMatch ys 
     in 
      if (findMatch theList = true) then i ::(findNum xs) 
      else (findNum xs) 
     end; 

實施例:

- findNum b; 
val it = [5,11] : int list 
+0

太棒了。非常感謝。 –

+0

很高興幫助! – coder

+1

你的if-then-elses可以縮短一點。 'if(number = y)then true else findMatch ys'等價​​於'number = y orelse findMatch ys'。同樣,如果findMatch theList,那麼'if(findMatch theList = true)then ...'可以縮短爲''。 –