我有以下代码:
import operator
def stagger(l, w):
if len(l)>=w:
return [tuple(l[0:w])]+stagger(l[1:], w)
return []
def pleat(f, l, w=2):
return map(lambda p: f(*p), stagger(l, w))
if __name__=="__main__":
print pleat(operator.add, range(10))
print pleat(lambda x, y, z: x*y/z, range(3, 13), 3)
print pleat(lambda x: "~%s~"%(x), range(10), 1)
print pleat(lambda a, b, x, y: a+b==x+y, [3, 2, 4, 1, 5, 0, 9, 9, 0], 4)
Run Code Online (Sandbox Code Playgroud)
重要部分:Pleat接受任何函数和任何序列,并将该序列中的第一批元素作为参数传递给接收函数.
有没有办法在Haskell中做到这一点,还是我在做梦?
在以下来自Eloquent Javascript的第5章的代码中,参数n的值来自何处?
为什么这个函数返回任何东西.我想,我讨厌问一个非特定的,陈词滥调的问题,但我感到困惑:这个功能如何运作?
function unless(test, then) {
if (!test) then();
}
function repeat(times, body) {
for (var i = 0; i < times; i++) body(i);
}
repeat(3, function(n) {
unless(n % 2, function() {
console.log(n, "is even");
});
});
// ? 0 is even
// ? 2 is evenRun Code Online (Sandbox Code Playgroud)
我正在使用Haskell,并尝试实现更高阶的函数,但我无法理解和测试函数,因为我不确定输入是什么样的.
由于函数本身是分级赋值的一部分,我不能请求有关编写/实现函数本身的帮助,因此我更改了函数名称和自定义类型名称,因此我可以使用该函数作为示例如果要将它们输入控制台,输入参数将如下所示.
search :: ([(Int,Int)] -> [[(Int,Int)]]) -> ([(Int,Int)] -> Bool) -> [[(Int,Int)]] -> Maybe [(Int,Int)]
search function1 function2 listOfIntegerPairs
Run Code Online (Sandbox Code Playgroud)
function1将整数对列表作为输入,并输出包含整数对的列表列表.
function2获取整数对列表并输出一个布尔值.
我不确定如何将这个高阶函数的参数输入控制台.
即它是这样的,我们包括函数和它的参数作为参数?
search (function1([(0,0),(0,1)])) (function2([(0,0),(0,1)])) [(0,0),(0,1)]
Run Code Online (Sandbox Code Playgroud)
这个表单会产生错误,但是我无法弄清楚输入参数会是什么样子,并且无法找到说明它的任何文章/教程.因此,我无法测试函数,直到我找出输入函数参数看起来像类型的东西.
谁能给我一些指导?我甚至可能要问什么?
我正在尝试从http://learnyouahaskell.com/higher-order-functions 的本指南中了解高阶函数。但我有点困惑,希望有人能为我澄清一些事情。
所以我在看这个例子:
applyTwice :: (a -> a) -> a -> a
applyTwice f x = f (f x)
Run Code Online (Sandbox Code Playgroud)
好的,applyTwice一个带有两个参数的函数,一个带有 typea和 return type的函数a,第二个参数是一个 type a。并且该函数返回一个类型a。
在命令行中我们得到这个结果:
ghci> applyTwice (++ " HAHA") "HEY"
"HEY HAHA HAHA"
Run Code Online (Sandbox Code Playgroud)
所以函数f是(++),它的类型是[a] -> [a] -> [a]。(++ " HAHA")部分应用正确吗?我们只给了它一个参数,所以它返回[a] -> [a]。在applyTwice定义中,我想从(f x)部分开始。所以 f 需要“HEY”,这会产生“HEY HAHA”类型a,然后我需要申请f才能获得“HEY HAHA HAHA”
编辑:用这两个例子: …
我正在使用R来构建数学模型.我想写一个函数f(a, b, g),它接受3个参数,最后一个是函数.我想知道我可以将函数作为参数传递给另一个函数吗?如果这是可能的,你们能给我一个简单的例子吗?谢谢.
假设我有一个更高阶的函数,它注册了某种点击监听器.我可以记录它的用途和listener传入的参数,如下所示:
/**
* Adds a [listener] that's called when the item is clicked.
*
* @param listener The listener to add
*/
fun addClickListener(listener: (count: Int) -> Unit) {
...
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,有没有办法记录参数listener?这将是count在这个例子中.在我的实际用例中,我的监听器中有多个参数.
我注意到的是[listener]文本可以在我正在使用此功能的文档视图中单击,但它只显示一个关于它的空对话框.有没有办法以某种方式描述参数?
现在,我最终@param在addClickListener方法中用块来描述侦听器的参数,但这会在IDE中产生警告,我想知道是否有更合适的方法来执行此操作.
我知道在Haskell中模式匹配函数是不可能的,我完全理解为什么.但是,我有两个密切相关的问题.首先,如果您想部分应用函数以供以后使用,是否有一种方法可以定义和捕获返回值(如果它是一个元组)?或者我错了,这还在尝试模仿我鼻子下的匹配功能?
例如,假设我正在尝试获取具有10的不同倍数的值的商和余数.然后,我怎么写这样的东西?
q, r :: Integral a => a -> a
(q, r) = (12345 `quotRem`)
Run Code Online (Sandbox Code Playgroud)
我在这里意识到,存在单独的功能,所以我可以这样做:
q, r :: Integral a => a -> a
q = (12345 `quot`)
r = (12345 `rem`)
Run Code Online (Sandbox Code Playgroud)
但是,这是一个非常具体的案例,并且有无限的其他函数示例返回元组,这些函数可以很好地概括.例如,一个返回列表中的平均数和赔率的函数.
evens, odds :: Integral a => [a] -> Int
(evens, odds) = (length . (filter even), length . (filter odd))
Run Code Online (Sandbox Code Playgroud)
这引出了我的第二个问题.以上在GHCi中工作得很好.
Prelude> let (evens, odds) = (length . (filter even), length . (filter odd))
Prelude> :t evens
evens :: Integral a => [a] …Run Code Online (Sandbox Code Playgroud) haskell pattern-matching higher-order-functions higher-order-types
我似乎无法理解如何id将其用作某些高阶函数的参数.我曾经在某个地方读到它曾经"习惯于"留下一些东西",但似乎无法理解它.
例如,为什么是这种类型的liftA2 id f (b -> c) -> f b -> f c?
另外,为什么我不能传递id到g了
g :: (Int -> Int -> Int) -> Int -> Int -> Int
Run Code Online (Sandbox Code Playgroud)
?
是否可以将 map 与带有多个参数的函数一起使用?
我想重复使用 map 的第二个和第三个参数作为函数的参数。如
mapF x y z = map (f y z) [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
因此,它会评估f与同y和z的值,但x = 1,x = 2,x = 3等等。
haskell list partial-application higher-order-functions map-function
科廷级
class LoginService{
fun getLoginData(loginData: String) {
request(LoginApi.create().getLoginData(loginData))}
}
fun changePassword(_:String){
request(LoginApi.create().changePassword(_)
}
class RequestData {
var retrofitCall: ((String) -> Unit)? = null
}
}
Run Code Online (Sandbox Code Playgroud)
Java类
class LoginModel{
private void loginData(){
RequestData data = new RequestData();
requestData.setRetrofitCall(username ->LoginService::getLoginData)
}
private void changePassword(){
RequestData data = new RequestData();
requestData.setRetrofitCall(username ->LoginService::changePassword)
}
}
Run Code Online (Sandbox Code Playgroud)
requestData.setRetrofitCall(username ->LoginService::changePassword)
为什么是高阶函数:
由于我必须区分从其功能调用函数的每个 API 调用,因此尝试使用。
如何调用上面突出显示的代码?
java android higher-order-functions kotlin kotlin-function-type