2017-02-28 106 views
0

我工作的任務從一個函數中提取值,並給出了以下功能:通過匹配

fun label (lb,ub) = 
let val s = callcc (fn k =>let fun branch c = if (c < ub) 
               then (pushCP (k,branch,c+1);c) 
               else ub 
          in (pushCP(k,branch,lb+1);lb) 
          end) 
in {value=s,dom=(lb,ub)} 
end; 

如果你把一個上限和下限假設1和3into此功能,將打印

val it = {dom=(1,3), value=1} 

我想弄清楚的是,如果它完全有可能獲得價值。在我的筆記中,它說兩種可能的方式是通過#value(x)或val {value = a,...} = x來實現的,但是我用這兩種方法都會遇到錯誤。 任何線索我做錯了什麼?

回答

2

目前尚不清楚你在做什麼錯了,因爲你沒有複製你真正嘗試過,但你的筆記是正確的:

- val x = {dom=(1,3), value=1}; 
val x = {dom=(1,3),value=1} : {dom:int * int, value:int} 

第一種方法是使用#value提取value場並#dom提取dom字段:

- #value x; 
val it = 1 : int 
- #dom x; 
val it = (1,3) : int * int 

第二種方法是使用模式匹配。您可以提取單個字段:

- val {value = a,...} = x; 
val a = 1 : int 

或者你可以一次提取兩個領域:

- val {dom = a, value = b} = x; 
val a = (1,3) : int * int 
val b = 1 : int 

爲了使上述工作,x需要綁定的值。也許你試圖用x這個沒有給出val綁定的方法來使用它。你需要這樣的東西:

val x = label(1,3) 

我沒有所有相關的代碼,所以我無法測試。如果上述內容不足以回答您的問題,則需要提供更多詳細信息。