2017-01-25 66 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

最佳答案!谢谢 :) –