2014-10-17 65 views
0

我是SML編程的新手,我創建了一個函數來從整數列表中刪除原子A的出現。這個列表可以嵌套到任何級別, 意味着我們可以擁有像[1,2,3]這樣的列表,並且我們可以擁有像[[1,2],[2,3]]這樣的列表以及像[[[ 1,2],[1,2]],[[2,3],[2,3]]]。
所以我的問題是如何檢查給定的項目是列表還是原子,因爲我到目前爲止還沒有在SMLNJ中找到任何這樣的函數?
我已經創建了一個函數來檢查列表是否爲空,然後調用helper迭代函數來檢查列表的頭部是列表還是原子。如果它是一個原子,那麼用另一個原子替換它,並繼續與尾部的其餘部分。在SML中區分原子和列表

如果我檢查列表頭的尾部是否爲空,那麼它會給出一個錯誤,因爲尾部函數只能有一個列表。
所以我必須這樣做,如 tl([hd(a)),如果我這樣做,那麼它將永遠是空的。
如果我將它應用到第一個列表中,我將head設置爲1並將它封裝在[]中的[]結果中,因此尾部將爲[]。同樣的方法,如果我得到第二個列表的頭將[1,2]並將其包裝在[]中將導致[[1,2]],因此尾部再次爲[]。 那麼有什麼辦法可以檢查給定的物品是原子還是列表?

在此先感謝您的回覆。

+1

你不能在運行時檢查什麼類型的東西 - 這在編譯時就已經知道了。我有一種感覺,你在這個任務的描述中漏掉了一些東西。 – molbdnilo 2014-10-20 13:05:56

+0

沒有,這是非常多的 實際上原來的問題是在計劃,但教授希望我們在SML /新澤西州實施這個,所以我在這裏沒有線索如何做到這一點。 這是最初的方案問題。 編寫一個方案功能,它採用兩個原子和一個列表作爲參數 並返回一個與參數列表相同的列表,除了所有出現的 列表中的第一個給定原子被替換爲第二個給定原子 無論多深第一個原子是嵌套的。 現在我的目標是在SML/NJ中實現這個 – 2014-10-20 13:46:45

回答

2

「此列表可以嵌套到任何級別」在SML中是不可能的,因爲它是靜態類型的,並且列表類型具有特定的元素類型。您有一個int list,這是一個列表,其元素全部爲intint list list,這是一個列表,其元素均爲int list。你不能混合。

與你所談論的最接近的是,再次爲這種數據類型的元素創建一個具有兩種情況的代數數據類型,一個葉或一個嵌套列表。然後你可以使用模式匹配來解構這個數據類型。

0

正如在其他的答案中指出:

你可以定義自己的數據類型

datatype 'a AtomList = Atom of 'a | List of 'a AtomList list 

然後,這種數據類型你可以定義你上面提到的原子列表:

val x = List([Atom(1),Atom(2),Atom(3)]) 
val y = List([List([Atom(1),Atom(2)]),List([Atom(3),Atom(4)])]) 
val z = List([ 
     List([ 
      List([Atom(1),Atom(2)]), 
      List([Atom(1),Atom(2)]), 
      List([ 
       List([Atom(2), Atom(3)]), 
       List([Atom(2), Atom(3)]) 
       ]) 

      ]) 
     ]) 

然後,您將使用模式匹配,如下所示:

fun show xs = 
    case xs of 
     Atom(x) => (*do something with atom*) 
     | List(ys) => (*do something with list of atoms *) 
+0

謝謝你解釋這個,但是 我在我的問題中有一個約束,我必須用任意深度的int列表。 – 2014-10-19 05:40:13

+1

而這個'AtomList'的東西通常被稱爲「樹」... – 2014-10-19 09:54:02

+0

@AshishTyagi你在說什麼?這已經是螞蟻任意深度。我所代表的與你給出的相同的例子都是不同的深度。我錯過了什麼嗎? – 2014-10-19 13:02:06