标签: currying

斯卡拉:咖喱的施工人员

我有以下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这样的东西,但是对于构造函数来说.

constructor scala currying

20
推荐指数
3
解决办法
5159
查看次数

R中的Currying函数

是否有可能使用钻营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......

r currying

20
推荐指数
2
解决办法
5304
查看次数

F#curried功能

任何人都有一个体面的例子,最好是实用/有用,他们可以发布演示概念吗?

f# functional-programming currying

19
推荐指数
3
解决办法
5915
查看次数

如何从Scala中的=> b => c得到(a,b)=> c?

如果我有:

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

functional-programming scala currying

18
推荐指数
3
解决办法
4031
查看次数

.Net是否支持咖喱仿制药?

假设我们有一个嵌套的泛型类:

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)

有没有办法提到" ABT=intU保持开放"?如果不是,这是C#限制还是CLR限制?

.net c# generics currying

18
推荐指数
1
解决办法
481
查看次数

在python的Currying装饰员

我正在尝试在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)

任何有关如何正确执行此操作的指示将非常感谢!

谢谢!

python decorator currying

18
推荐指数
3
解决办法
5981
查看次数

为什么curried函数需要外部参数名称?

鉴于这种简单的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 ...

似乎不起作用.

currying swift

18
推荐指数
2
解决办法
1783
查看次数

使用C++ lambda进行部分应用?

编辑:我在下面使用咖喱,但已被告知这是部分申请.

我一直想弄清楚如何在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)

c++ lambda currying c++11

17
推荐指数
4
解决办法
5371
查看次数

currying和多个参数列表之间有什么区别?

无论我到哪里,我都会看到多个参数列表和currying用于互换的术语.我在几十个stackoverflow问题中看到它,甚至在scala-lang.org上. 例如,该页面的标题为"Currying".而第一句话?"方法可以定义多个参数列表."

然而,当一些知识渊博的人看到多个参数列表并且等同于curry时,他们会感到恼火.我发布了这个问题的答案,但后来当我看到Randall Schulz的评论时将其删除,因为我担心我可能会无意中传播错误的信息.我的理解是,具有多个参数列表的函数必然是一个curried函数,但是函数currying也可以通过其他方式实现(这个问题的最佳答案列出了四种方式),但我不确定这是整个故事.我想真正理解这种区别.

我知道在stackoverflow 上有很多非常相似的问题,但是我没有找到一个能够准确地说出差异的问题.关于多个参数列表和currying,我需要了解什么才能准确地说出它们?

scala currying

17
推荐指数
1
解决办法
1041
查看次数

何时评估F#函数调用; 懒惰还是马上?

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打开盒子一样).是否有保证何时进行添加?

f# currying lazy-evaluation

16
推荐指数
3
解决办法
1985
查看次数