考虑以下方法:
int Foo(string st, float x, int j)
{
...
}
Run Code Online (Sandbox Code Playgroud)
Func<float, int>现在我想通过提供参数st和 的值将其包装在类型的委托中j。但我不知道语法。有人可以帮忙吗?
这是这个想法(可能看起来有点像 Haskell):
Func<float, int> myDelegate = new Func<float, int>(Foo("myString", _ , 42));
// by providing values for st and j, only x is left as a parameter and return value is int
Run Code Online (Sandbox Code Playgroud) scala中是否有一种方法可以从已经部分应用的函数中获取参数?
这是否有意义,应该完成,还是适合任何用例?
例:
def doStuff(lower:Int,upper:Int,b:String)=
for(turn <- lower to upper) println(turn +": "+b)
想象一下,我一度知道'较低'的论点,我得到一个将它应用于'doStuff'的功能
val lowerDoStuff = doStuff(3,_:Int,_:String)
有没有办法让我回来?(例如,假设我在一个只收到'lowerDoStuff'并且现在需要知道第一个参数的函数内)
习惯性scala更喜欢内省/反思(如果可能的话).
我正在写一个快速的DB perf测试,并选择F#所以我可以得到更多练习.
我创建了一个measureSelectTimes具有签名的方法Guid list * Guid list -> IDbCommand -> TimeSpan * TimeSpan.
然后,我称之为:
let runTests () =
let sqlCeConn : IDbConnection = initSqlCe() :> IDbConnection
let sqlServerConn : IDbConnection = initSqlServer() :> IDbConnection
let dbsToTest = [ sqlCeConn; sqlServerConn ]
let cmds : seq<IDbCommand> = dbsToTest |> Seq.map initSchema
let ids : seq<Guid list * Guid list> = cmds |> Seq.map loadData
let input = Seq.zip ids cmds
let results = input |> Seq.map (fun …Run Code Online (Sandbox Code Playgroud) 想知道您是否可以评论为什么以下两种情况的行为方式不同:
以下作品:
var la= List(12, 13 , 14 ,15);
var func = (x:Int) => println(x)
la.foreach(func) // 1
la.foreach(func(_)) // 2
Run Code Online (Sandbox Code Playgroud)
但以下不是:
var la= List(12, 13 , 14 ,15);
var func1 = (x:Int) => {
for (i <- 0 to x) yield i*2
} mkString
la.foreach(println(func1)) // similar to 1 above
la.foreach(println(func1(_))) // similar to 2 above
Run Code Online (Sandbox Code Playgroud)
错误:类型不匹配; 发现:所需单位:Int =>?la.foreach(的println(FUNC1(_)))
在C/C++(可能是前C++ 11)中,是否可以做到
A (*eval(A (*function)(B), B b))(){
// ... ??
}
Run Code Online (Sandbox Code Playgroud)
即一个功能
返回 - 从()返回A的函数... ??
如果是,那就是
提前谢谢你,尼克
2014-4-20(1):感谢您提及'evtl.'(固定)std :: bind.:-)
所以-理解- (在C /预C++ 11不带升压)函数指针是例外的方式,里面的功能,它是唯一能够宣布他们,但有没有办法来产生或修改一个实例 -作为函数/方法定义是函数指针实例的唯一可能来源,可以从哪里明确地或通过函数/方法参数移交它们.
只是问,因为我不清楚函数指针的可能内部表示......
2014-4-20(2):在Danvil的贡献下,现在是时候揭示,这里有模板:
template<typename T,typename A>
struct Evaluator {
T(*f)(A);
A a;
T operator()() const { return f(a); }
};
template<typename T,typename A>
Evaluator<T,A> eval(T(*f)(A), A a) {
Evaluator<T,A> w;
w.f= f; w.a= a;
return w;
}
Run Code Online (Sandbox Code Playgroud)
这是有效的,而 - 正如一些人已经猜到的那样 …
我正在学习Haskell,我一直在试验部分应用程序.我试图适当地应用sortBy.我没有看到结果函数的类型.它应该如何正确完成?
let mf = sortBy compare
:t mf
mf :: [()] -> [()]
Run Code Online (Sandbox Code Playgroud) 在一些函数式语言中,部分应用函数和柯里化函数是两个相似但不同的概念。
阅读《Learn You a Haskell for Great Good》一书,作者似乎可以互换应用这些。
【Curried 函数】 Haskell 中的每个函数官方都只带一个参数。
...
如果我们调用一个参数太少的函数,我们会得到一个部分应用的函数,这意味着一个函数的参数与我们省略的参数一样多。
我的问题是:Haskell 中部分应用和柯里化的概念可以互换吗?
赫顿在Haskell编程说
计算表达式时,应以什么顺序执行归约?一种通用策略(称为 最内层评估)是始终选择最内层的Redex,因为它不包含其他Redex。如果最里面的redex不止一个,按照惯例,我们选择一个从表达式最左边的位置开始的redex。
对表达式进行评估的另一种常见策略是对最内层的评估,它总是选择最外层的Redex,因为它不包含在其他Redex中。如果有多个这样的redex,则像以前一样,我们选择从最左边开始的那个。毫不奇怪,这种评估策略被称为 最外部评估。
在部分应用功能时,例如mult(3)(4),其中mult定义为
mult :: (Int,Int) -> Int
mult (x,y) = x * y
Run Code Online (Sandbox Code Playgroud)
最内层的评估将首先评估mult(3)为\y->3*y,然后评估(\y->3*y)4。最外部的评估将如何评估mult(3)(4)?
在应用咖喱函数时,例如mult'(3)(4),其中
mult' :: Int -> Int -> Int
mult' x = \y -> x * y
Run Code Online (Sandbox Code Playgroud)
最内层的评估将首先评估mult'(3)为\y->3*y,然后评估(\y->3*y)4。最外部的评估将如何评估mult'(3)(4)?
evaluation haskell functional-programming currying partial-application
在我们阅读的类型同义词中
就像我们可以部分应用函数来获取新函数一样,我们可以部分应用类型参数并从中获取新的类型构造函数。
如何将参数 应用于其他事物?我认为它实际上应该是
就像我们可以部分应用函数来获取新函数一样,我们可以部分应用类型构造函数(给它们比他们期望的更少的类型参数)并从中获取新的类型构造函数。
你同意?
haskell partial-application language-lawyer type-constructor
我认为 OCaml 会阅读
let f : int -> int list -> int list = (::);;
Run Code Online (Sandbox Code Playgroud)
作为部分应用的实例,并将函数存储为f. 但是,编译器抱怨该函数应用于太少的参数。对此的任何见解将不胜感激,谢谢。