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当只有一个参数传递给它时,我无法看到如何工作。
帮助。
这并不意味着你的想法:
\n\nfun funkyPlus 3 = (fn x => fn y => x*x*y)3\nRun Code Online (Sandbox Code Playgroud)\n\n它定义了一个函数,该函数接受的参数必须为 3,如果为 3,则计算其 RHS,否则未定义。你的意思是这样的:如果我们只提供 x 的一个参数,我们有以下结果:
\n\nfunkyPlus 3\n\xe2\x86\x92 (fn x => fn y => x*x+y) 3\nRun Code Online (Sandbox Code Playgroud)\n\n等等。
其次,您的内容有错误foldl:
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\nRun Code Online (Sandbox Code Playgroud)\n\n这是因为(h,b)被解析为 的第三个参数foldl,而不是作为 的参数f。将其括起来:
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\nRun Code Online (Sandbox Code Playgroud)现在,回答你的问题,机器学习可以告诉我们,像这样的表达式的foldl add类型为int -> int list -> int。
但总的来说,认识到函数应用完全是机械的可能会有所帮助。如果我们有这两个定义:
\n\nfun foldl f b [] = b\n | foldl f b (h::t) = foldl f (f(h,b)) t;\nadd (x,y) = x + y;\nRun Code Online (Sandbox Code Playgroud)\n\n那么var example = foldl add就相当于:
fun example b [] = b\n | example b (h::t) = example (h::t) (add(h,b)) t;\nRun Code Online (Sandbox Code Playgroud)\n\n所有 \xe2\x80\x99s 所做的就是在 的 正文中add替换了,仅此而已(尽管我冒昧地在正文中替换了 )。ffoldlfoldl addexample
| 归档时间: |
|
| 查看次数: |
458 次 |
| 最近记录: |