【发布时间】:2022-08-14 02:02:51
【问题描述】:
以下 SML 代码取自华盛顿大学 course 的家庭作业。 (具体来说,它是提供的代码的一部分,以便学生可以使用它来完成course webpage 上列出的作业 3。)我不是在这里寻求家庭作业帮助——我想我明白代码在说什么。我不太明白的是如何允许根据自己的部分应用程序定义柯里化函数。
datatype pattern =
WildcardP
| VariableP of string
| UnitP
| ConstantP of int
| ConstructorP of string * pattern
| TupleP of pattern list
fun g f1 f2 p =
let
val r = g f1 f2 (* Why does this not cause an infinite loop? *)
in
case p of
WildcardP => f1 ()
| VariableP x => f2 x
| ConstructorP(_,p) => r p
| TupleP ps => List.foldl (fn (p,i) => (r p) + i) 0 ps
| _ => 0
end
函数绑定是一个递归定义,它利用pattern 的数据类型绑定中的递归结构。但是当我们到达val r = g f1 f2 行时,为什么不会导致执行认为,“等等,g f1 f2 是什么?这就是我通过将f2 传递给由将f1传递给g。那么让我们回到g\"的定义,进入一个无限循环?
标签: functional-programming sml currying partial-application