标签: higher-order-functions

将高阶函数从Python转换为Haskell

我有以下代码:

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中做到这一点,还是我在做梦?

python haskell higher-order-functions

2
推荐指数
1
解决办法
364
查看次数

在这个更高级别的函数中,参数n来自何处?

在以下来自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 even
Run Code Online (Sandbox Code Playgroud)

javascript higher-order-functions

2
推荐指数
1
解决办法
248
查看次数

Haskell - 如果将函数作为参数,高阶函数的输入是什么样的?

我正在使用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)

这个表单会产生错误,但是我无法弄清楚输入参数会是什么样子,并且无法找到说明它的任何文章/教程.因此,我无法测试函数,直到我找出输入函数参数看起来像类型的东西.

谁能给我一些指导?我甚至可能要问什么?

haskell higher-order-functions

2
推荐指数
1
解决办法
594
查看次数

高阶函数

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

编辑:用这两个例子: …

haskell higher-order-functions

2
推荐指数
1
解决办法
224
查看次数

R语言,我们可以传递函数作为参数

我正在使用R来构建数学模型.我想写一个函数f(a, b, g),它接受3个参数,最后一个是函数.我想知道我可以将函数作为参数传递给另一个函数吗?如果这是可能的,你们能给我一个简单的例子吗?谢谢.

r higher-order-functions

2
推荐指数
1
解决办法
1317
查看次数

记录Kotlin中函数参数的参数

假设我有一个更高阶的函数,它注册了某种点击监听器.我可以记录它的用途和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]文本可以在我正在使用此功能的文档视图中单击,但它只显示一个关于它的空对话框.有没有办法以某种方式描述参数?

在此输入图像描述 出现的监听器文档

现在,我最终@paramaddClickListener方法中用块来描述侦听器的参数,但这会在IDE中产生警告,我想知道是否有更合适的方法来执行此操作.

documentation higher-order-functions kotlin

2
推荐指数
1
解决办法
99
查看次数

有没有办法在Haskell中捕获高阶函数的元组?

我知道在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

2
推荐指数
1
解决办法
159
查看次数

高阶函数和id

我似乎无法理解如何id将其用作某些高阶函数的参数.我曾经在某个地方读到它曾经"习惯于"留下一些东西",但似乎无法理解它.

例如,为什么是这种类型的liftA2 id f (b -> c) -> f b -> f c

另外,为什么我不能传递idg

g :: (Int -> Int -> Int) -> Int -> Int -> Int
Run Code Online (Sandbox Code Playgroud)

haskell higher-order-functions

2
推荐指数
1
解决办法
105
查看次数

将 map 与具有多个参数的函数一起使用

是否可以将 map 与带有多个参数的函数一起使用?

我想重复使用 map 的第二个和第三个参数作为函数的参数。如

mapF x y z = map (f y z) [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

因此,它会评估f与同yz的值,但x = 1x = 2x = 3等等。

haskell list partial-application higher-order-functions map-function

2
推荐指数
1
解决办法
4735
查看次数

从 Java 调用 Kotlin 的高阶函数

科廷级

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

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