2011-11-04 76 views
5

我有下面的代碼:SML - 綁定變量或構造

datatype expr = K of string| Number2 of expr * (expr list); 
datatype number = Number1 of string | Number3 of int; 
fun append (nil, l2) = l2 
    | append (x::xs, l2) = x::append(xs, l2); 
fun map [] = [] 
    | map (h::t) = (What h)::(map t); 
fun What (K x) = [Number1(x)] 
    |What (Number2 (t,[])) = Number3(0)::What(t) 
    |What (Number2 (y,a::b)) = append(What(a), map(b)); 

它不能識別功能「是什麼」(未綁定變量或構造函數)。我該如何解決它,它會知道「什麼」功能?

謝謝。

回答

7

SML中的聲明從上到下工作,所以map看不到What。切換訂單將無濟於事,因爲What不會看到map,從而給出相同的錯誤。相反,你需要聲明同時使用and相互遞歸函數:

fun map [] = [] 
    | map (h::t) = (What h)::(map t) 
and What (K x) = [Number1(x)] 
    | What (Number2 (t,[])) = Number3(0)::What(t) 
    | What (Number2 (y,a::b)) = append(What(a), map(b)) 
3

你必須使用and相互遞歸。儘管在代碼中有其他問題。 What顯然是expr -> number list,這意味着map必須是expr list -> (number list) list,所以在您的最後一行中,您嘗試將number list list附加到number list。儘管代碼的意圖還不清楚,所以你可能不得不自己制定你想要的邏輯。看起來沒有任何明顯的方式來編寫具有所需類型的函數。

+0

謝謝尼古拉斯,我只是處理這個問題,然後堆疊起來。 「b」可以是expr的列表。我只想檢查列表中的每個expr,並確定它是否爲「Number1」或「Number3」或數據類型expr - 我通過函數What完成的所有操作。唯一的想法是使用「地圖」來檢查列表中的每個成員。但它給出了一個錯誤:「操作數和操作符不同意」。任何想法? –

+2

您的類型非常困惑。首先,是的:b絕對是expr的列表。他們都是exprs:b中沒有Number1或Number3s。你將不得不向我們解釋你想做什麼,因爲我認爲我們沒有機會幫助你。你是否意識到你的地圖功能與普通地圖非常不同?也許這就是混亂。你也忽略了y; expr是爲了什麼而使用的? –

+1

爲什麼我的函數與法線貼圖不一樣? 我會澄清我的問題:Number 2是expr,可以是expr的列表。現在,如果它是expr的列表,那麼我想檢查該列表中的每個成員,並找出它是否爲K或Number2。然後,我需要決定如何處理這個成員(它可以是Number1或Number3,我在What函數中的前兩行),並創建一個僅包含Number1或Number3的列表。 所以,我直觀的方法是使用地圖來檢查「b」中的每個成員,通過使用map函數解開列表的末尾。 謝謝。 –