我有以下Scala类:
class Person(var name : String, var age : Int, var email : String)
Run Code Online (Sandbox Code Playgroud)
我想使用Person构造函数作为curried函数:
def mkPerson = (n : String) => (a : Int) => (e : String) => new Person(n,a,e)
Run Code Online (Sandbox Code Playgroud)
这有效,但还有另一种方法可以做到这一点吗?这种方法似乎有点乏味且容易出错.我可以想象像Function.curried这样的东西,但是对于构造函数来说.
是否有可能使用钻营的R?
一种可能性是具有特殊paste功能(可以将其视为此处的后续操作),例如(在错误的代码中):
'%+%' <- (sep)function(x,y) paste(x,y,sep=sep)
"a"%+%("")"b"%+%("_")"c" #gives "ab_c"
Run Code Online (Sandbox Code Playgroud)
什么是可能的实现R?
PS:这paste只是一个例子,我很好奇R......
任何人都有一个体面的例子,最好是实用/有用,他们可以发布演示概念吗?
如果我有:
val f : A => B => C
Run Code Online (Sandbox Code Playgroud)
这是以下的简写:
val f : Function1[A, Function1[B, C]]
Run Code Online (Sandbox Code Playgroud)
如何获得g带签名的功能:
val g : (A, B) => C = error("todo")
Run Code Online (Sandbox Code Playgroud)
(即)
val g : Function2[A, B, C] //or possibly
val g : Function1[(A, B), C]
Run Code Online (Sandbox Code Playgroud)
在f?
假设我们有一个嵌套的泛型类:
public class A<T> {
public class B<U> { }
}
Run Code Online (Sandbox Code Playgroud)
这里,typeof(A<int>.B<>)本质上是一个具有两个参数的泛型类,其中只有第一个被绑定.
如果我有一个带有两个参数的单个类
public class AB<T, U> { }
Run Code Online (Sandbox Code Playgroud)
有没有办法提到" AB有T=int和U保持开放"?如果不是,这是C#限制还是CLR限制?
我正在尝试在python中写一个currying装饰器,我想我已经有了一般的想法,但仍然有一些不正常的情况......
def curry(fun):
cache = []
numargs = fun.func_code.co_argcount
def new_fun(*args, **kwargs):
print args
print kwargs
cache.extend(list(args))
if len(cache) >= numargs: # easier to do it explicitly than with exceptions
temp = []
for _ in xrange(numargs):
temp.append(cache.pop())
fun(*temp)
return new_fun
@curry
def myfun(a,b):
print a,b
Run Code Online (Sandbox Code Playgroud)
虽然对于以下情况,这可以正常工作:
myfun(5)
myfun(5)
Run Code Online (Sandbox Code Playgroud)
对于以下情况,它失败:
myfun(6)(7)
Run Code Online (Sandbox Code Playgroud)
任何有关如何正确执行此操作的指示将非常感谢!
谢谢!
鉴于这种简单的currying功能:
func foo(x:Int)(y:Int)->String{
return "\(x) with \(y)"
}
Run Code Online (Sandbox Code Playgroud)
我希望能够做到这样的事情:
let bar = foo(1)
bar(2) //<- error: Missing argument label 'y:' in call
Run Code Online (Sandbox Code Playgroud)
如果我将调用标记为bar(如在bar(y:2)),一切正常.但我不明白为什么参数名称是必要的.有什么办法可以避免吗?
显而易见的事:
func foo(x:Int)(_ y:Int)->String ...
似乎不起作用.
编辑:我在下面使用咖喱,但已被告知这是部分申请.
我一直想弄清楚如何在C++中编写咖喱函数,我实际上已经弄明白了!
#include <stdio.h>
#include <functional>
template< class Ret, class Arg1, class ...Args >
auto curry( Ret f(Arg1,Args...), Arg1 arg )
-> std::function< Ret(Args...) >
{
return [=]( Args ...args ) { return f( arg, args... ); };
}
Run Code Online (Sandbox Code Playgroud)
我也为lambdas写了一个版本.
template< class Ret, class Arg1, class ...Args >
auto curry( const std::function<Ret(Arg1,Args...)>& f, Arg1 arg )
-> std::function< Ret(Args...) >
{
return [=]( Args ...args ) { return f( arg, args... ); };
}
Run Code Online (Sandbox Code Playgroud)
测试:
int f( int x, int …Run Code Online (Sandbox Code Playgroud) 无论我到哪里,我都会看到多个参数列表和currying用于互换的术语.我在几十个stackoverflow问题中看到它,甚至在scala-lang.org上. 例如,该页面的标题为"Currying".而第一句话?"方法可以定义多个参数列表."
然而,当一些知识渊博的人看到多个参数列表并且等同于curry时,他们会感到恼火.我发布了这个问题的答案,但后来当我看到Randall Schulz的评论时将其删除,因为我担心我可能会无意中传播错误的信息.我的理解是,具有多个参数列表的函数必然是一个curried函数,但是函数currying也可以通过其他方式实现(这个问题的最佳答案列出了四种方式),但我不确定这是整个故事.我想真正理解这种区别.
我知道在stackoverflow 上有很多非常相似的问题,但是我没有找到一个能够准确地说出差异的问题.关于多个参数列表和currying,我需要了解什么才能准确地说出它们?
F#中的Curried函数.我得到了一个位,传入一个参数子集产生一个带预设的函数.我只是想知道传递所有参数是否有任何不同.例如:
let addTwo x y = x + y
let incr a = addTwo 1
let added = addTwo 2 2
Run Code Online (Sandbox Code Playgroud)
incr是一个带有一个论点的函数.是addedint还是函数?我可以想象一个实现,其中"添加"仅在使用时被懒惰地评估(就像Schroedinger的Cat打开盒子一样).是否有保证何时进行添加?