部分评估和柯里化

kri*_*tap 5 recursion programming-languages functional-programming sml currying

我已经开始理解一些与柯里化相关的例子,但我仍然对柯里化的概念不满意。我知道 currying 可用于进行部分评估,但我不确定在某些情况下它会如何工作。

我知道它在下面的例子中是如何工作的:

fun funkyPlus x y = x*x+y;
Run Code Online (Sandbox Code Playgroud)

所以假设我们只为 x 传递一个参数,那么它等价于以下内容:

fun funkyPlus 3 = (fn x => fn y => x*x+y)3
Run Code Online (Sandbox Code Playgroud)

最终返回

fn y => 9+y
Run Code Online (Sandbox Code Playgroud)

现在,我正在尝试将这个想法应用到内置函数中foldl

我知道它的代码是:

fun foldl f b [] = b
   |foldl f b (h::t) = foldl f f(h,b) t.
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果我们不将所有参数传递给foldl(即我们只传递第一个参数,即函数('a*'b->'b))怎么办。在我给出的第一个例子中,当只有一个参数传递给函数时,很容易看出函数是如何工作的。但是,foldl当只有一个参数传递给它时,我无法看到如何工作。

帮助。

Jos*_*Lee 2

    \n
  1. 这并不意味着你的想法:

    \n\n
    fun funkyPlus 3 = (fn x => fn y => x*x*y)3\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    它定义了一个函数,该函数接受的参数必须为 3,如果为 3,则计算其 RHS,否则未定义。你的意思是这样的:如果我们只提供 x 的一个参数,我们有以下结果:

    \n\n
    funkyPlus 3\n\xe2\x86\x92 (fn x => fn y => x*x+y) 3\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    等等。

  2. \n
  3. 其次,您的内容有错误foldl

    \n\n
    fun foldl f b [] = b|foldl f b (h::t) = foldl f f(h,b) t;\n                                                 ^^^^^\nType clash: expression of type\n  'a * 'b\ncannot have type\n  'c list\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    这是因为(h,b)被解析为 的第三个参数foldl,而不是作为 的参数f。将其括起来:

    \n\n
    fun foldl f b [] = b|foldl f b (h::t) = foldl f (f(h,b)) t;\n> val ('a, 'b) foldl = fn : ('a * 'b -> 'b) -> 'b -> 'a list -> 'b\n
    Run Code Online (Sandbox Code Playgroud)
  4. \n
\n\n

现在,回答你的问题,机器学习可以告诉我们,像这样的表达式的foldl add类型为int -> int list -> int

\n\n

但总的来说,认识到函数应用完全是机械的可能会有所帮助。如果我们有这两个定义:

\n\n
fun foldl f b [] = b\n  | foldl f b (h::t) = foldl f (f(h,b)) t;\nadd (x,y) = x + y;\n
Run Code Online (Sandbox Code Playgroud)\n\n

那么var example = foldl add就相当于:

\n\n
fun example b [] = b\n  | example b (h::t) = example (h::t) (add(h,b)) t;\n
Run Code Online (Sandbox Code Playgroud)\n\n

所有 \xe2\x80\x99s 所做的就是在 的 正文中add替换了,仅此而已(尽管我冒昧地在正文中替换了 )。ffoldlfoldl addexample

\n