在Python中,我想编写一个make_cylinder_volume(r)
返回另一个函数的函数.返回的函数应该可以使用参数调用h
,并返回具有高度h
和半径的圆柱体积r
.
我知道如何从Python中的函数返回值,但是如何返回另一个函数?
我已经开始使用C++进行函数式编程的基础知识.我正在尝试创建一个f(a)(b)(c)
将返回的函数a + b + c
.我成功实现了f(a)(b)
返回a + b 的函数.这是它的代码:
std::function<double(double)> plus2(double a){
return[a](double b){return a + b; };
}
Run Code Online (Sandbox Code Playgroud)
我只是无法弄清楚如何实现f(a)(b)(c)
我之前声明应该返回的功能a + b + c
.
我总是对学习新语言感兴趣,这一事实让我保持警惕,让我(我相信)成为更好的程序员.我征服Haskell的尝试来了又走 - 到目前为止两次 - 我决定是时候再试一次.第三次是魅力吧?
不.我重新阅读了我的旧笔记......并感到失望:-(
上次让我失去信心的问题很简单:整数的排列.即从整数列表到列表列表 - 列表的排列:
[int] -> [[int]]
Run Code Online (Sandbox Code Playgroud)
这实际上是一个普遍的问题,因此用'a'替换上面的'int'仍然适用.
从我的笔记:
我先自己编码,然后成功.欢呼!
我将我的解决方案发送给我的一位好朋友--Haskell大师,通常有助于向大师学习 - 他告诉我这个,据我所知,"表达了语言的真正力量,使用通用设施来编码你的需要".所有这一切,我最近喝了kool-aid,让我们走吧:
permute :: [a] -> [[a]]
permute = foldr (concatMap.ins) [[]]
where ins x [] = [[x]]
ins x (y:ys) = (x:y:ys):[ y:res | res <- ins x ys]
Run Code Online (Sandbox Code Playgroud)
嗯.让我们打破这个:
bash$ cat b.hs
ins x [] = [[x]]
ins x (y:ys) = (x:y:ys):[ y:res | res <- ins x ys]
bash$ ghci
Prelude> :load b.hs
[1 of 1] Compiling Main ( b.hs, interpreted …
Run Code Online (Sandbox Code Playgroud) 我试图了解在Scala中讨论部分应用程序的优点.请考虑以下代码:
def sum(f: Int => Int) = (a: Int, b: Int) => f(a) + f(b)
def sum2(f: Int => Int, a: Int, b: Int): Int = f(a) + f(b)
def sum3(f: Int => Int)(a: Int, b: Int): Int = f(a) + f(b)
val ho = sum({identity})
val partial = sum2({ identity }, _, _)
val currying = sum3({ identity })
val a = currying(2, 2)
val b = partial(2, 2)
val c = ho(2, 2)
Run Code Online (Sandbox Code Playgroud)
那么,如果我可以轻松计算部分应用的功能,那么currying的优点是什么?
这是一个Scala会话,它定义并尝试了一些函数:
scala> def test1(str: String) = str + str;
test1: (str: String)java.lang.String
scala> test1("ab")
res0: java.lang.String = abab
Run Code Online (Sandbox Code Playgroud)
很好地工作.
scala> val test2 = test1
<console>:6: error: missing arguments for method test1 in object $iw;
follow this method with `_' if you want to treat it as a partially applied function
val test2 = test1
^
Run Code Online (Sandbox Code Playgroud)
哎呀.
scala> val test2 = test1 _
test2: (String) => java.lang.String = <function1>
scala> test2("ab")
res1: java.lang.String = abab
Run Code Online (Sandbox Code Playgroud)
效果很好!
现在,我已经看到_
折叠时的语法(_ + …
写作一个未经重构的命令和OO程序员......
最近和Erlang以及Haskell搞砸了.我喜欢Erlang,还不确定Haskell.功能似乎更像数学而不是编程,希望有意义.功能编程似乎非常强大.
阅读关于互动函数编程的文档我经常遇到"currying"这个词.我似乎只找到了一些有点过头的文档 - 很多术语都没有定义.
什么是currying?
我已经找了类似的已经发布的问题,但没有找到任何东西,所以请随意指出我已建立的线程.
不应该像Haskell这样的惰性语言允许这个定义,其中函数是curry?
apply f [] = f
apply f (x:xs) = apply (f x) xs
Run Code Online (Sandbox Code Playgroud)
它基本上是一个将给定函数应用于给定参数列表的函数,并且很容易在Lisp中完成.有没有解决方法?
我想使这种语法成为可能:
var a = add(2)(3); //5
Run Code Online (Sandbox Code Playgroud)
根据我在http://dmitry.baranovskiy.com/post/31797647上读到的内容
我不知道如何使它成为可能.
什么是currying?
如何在C++中完成currying?
请解释STL容器中的粘合剂?
假设我有一个指向函数的指针_stack_push(stack* stk, void* el)
.我希望能够调用curry(_stack_push, my_stack)
并获取刚刚执行的功能void* el
.我想不出办法,因为C不允许运行时函数定义,但我知道有比我更聪明的人:).有任何想法吗?