2017-01-25 73 views
0

有人可以解釋一下:「g的描述」嗎? f1如何取得單位並返回一個int &其餘的我也很困惑!模式匹配SML?

(* Description of g: 
* g takes f1: unit -> int, f2: string -> int and p: pattern, and returns 
* an int. f1 and f2 are used to specify what number to be returned for 
* each Wildcard and Variable in p respectively. The return value is the 
* sum of all those numbers for all the patterns wrapped in p. 
*) 

datatype pattern = Wildcard 
       | Variable of string 
       | UnitP 
       | ConstP of int 
       | TupleP of pattern list 
       | ConstructorP of string * pattern 

datatype valu = Const of int 
       | Unit 
       | Tuple of valu list 
       | Constructor of string * valu 


fun g f1 f2 p = 
    let 
     val r = g f1 f2 
    in 
     case p of 
      Wildcard   => f1() 
     | Variable x   => f2 x 
     | TupleP ps   => List.foldl (fn (p,i) => (r p) + i) 0 ps 
     | ConstructorP (_,p) => r p 
     | _     => 0 
    end 

通配符匹配一切併產生綁定的空單。

變量s匹配任何值v併產生保存(s,v)的單元素列表。

單位P只匹配Unit併產生綁定的空列表。

ConstP 17只匹配Const 17併產生綁定的空列表(對於其他整數也是類似的)。

TupleP PS形式元組的值匹配VS如果PS VS和具有相同的長度和對於所有的i,PS的第i個元件的相對於綁定產生的列表中的第i個元素相匹配是來自嵌套模式匹配的所有列表附加在一起。

ConstructorP(S1,P)匹配構造(S2,v)如S1和S2相同的字符串(可以將它們與=比較)和p匹配訴產生綁定的列表是從所述列表中嵌套模式匹配。我們將字符串s1和s2稱爲構造函數名稱。

沒有其他匹配。

回答

2

有人能解釋一下:「g的描述」嗎? f1如何取得單位並返回一個int &其餘的我也很困惑!

  • 功能g具有類型(單元→INT)→(串→INT)→圖案→INT,所以它需要三個(咖喱)參數,其中兩個是函數和一個爲模式

  • 參數f1f2必須是確定性的函數總是返回相同的常數,或功能有副作用,可以分別返回任意的整數/串,由外部來源確定。

    由於評論說的是「每個通配符可能返回的數量和可變」,聽起來更可能是f1應該在不同的時間返回不同的數字(我不知道什麼指在f2的情況下!)。一個定義可能是這樣的:

    local 
        val counter = ref 0 
    in 
        fun uniqueInt() = !counter before counter := !counter + 1 
        fun uniqueString() = "s"^Int.toString (uniqueInt()) 
    end 
    

    雖然這只是一個猜測。該定義僅適用於Int.maxInt

  • 註釋說明g的返回值作爲

    [...]所有這些數字爲包裹在P中的所有模式的總和。

    由於號碼不歸於任何意義,它似乎並不像g提供任何實際用途,但到任意給定的f1f2的輸出比較針對沒有給出一個任意測試。

  • 抓,所有的模式往往是壞:

    ... 
    | _ => 0 
    

    沒有別的匹配。

    的原因是,如果你用其他類型的模式擴展模式,編譯器不會通知您在功能g缺失模式;如果可能還沒有定義的話,這種全面性將會錯誤地意味着意義。

+0

最佳答案!謝謝 :) –