标签: higher-order-functions

为什么我的滤镜版本的表现与Swifts不同?

作为练习,我重写了一些Swift的高阶函数,一个是.filter.我决定.filter使用乐器测量我对抗Swift的版本,我对结果感到困惑.

这是我的过滤器版本,我承认可能不正确.

extension Array {
    func myFilter(predicate: Element -> Bool) -> [Element] {
        var filteredArray = [Element]()
        for x in self where predicate(x) {
            filteredArray.append(x)
        }

        return filteredArray
    }
}
Run Code Online (Sandbox Code Playgroud)

发生了什么

我的过滤器

  • 整体CPU消耗:85.7%
  • 我的过滤器的消耗量:67.9%

在此输入图像描述 在此输入图像描述

斯威夫特的过滤器

  • 整体CPU消耗:57.7%
  • 我的过滤器的消耗量:70.9%

在此输入图像描述 在此输入图像描述

我的期望

我期待类似的表现.我很困惑为什么我的过滤器函数调用本身会消耗更少的CPU,但我的整体应用程序CPU高出近30%.

我的问题

如果我filter写错了,请帮助我理解我的错误.否则请指出为什么Swift的filterCPU负载比我的减少了30%.

filter instruments higher-order-functions swift

9
推荐指数
1
解决办法
333
查看次数

不确定如何使用组合器设计有用的库

我一直在阅读关于组合器的信息,看看它们有多大用处(例如,在Haskell的Parsec中).我的问题是,我不太确定如何实际使用它们.

以下是问题的概述:可以生成,过滤和修改分布.可以组合分布以创建新的分布.

基本接口是(伪Haskell类型术语):

generator::      parameters -> distribution

selector::       parameters -> (distribution -> distribution)

modifier::       parameters -> (distribution -> distribution)
Run Code Online (Sandbox Code Playgroud)

现在,我认为我看到了三个组合器:

combine::     generator -> generator -> generator

filter::      generator -> selector -> generator

modify::      generator -> modifier -> generator
Run Code Online (Sandbox Code Playgroud)

这些实际上是组合器吗?组合器是否有意义/是否还有其他明显的组合器我缺少?

谢谢你的建议.

haskell functional-programming combinators higher-order-functions

8
推荐指数
1
解决办法
297
查看次数

使用构造函数所在的函数

有两个简单的类Int作为参数:

case class Foo(i: Int)
     class Bar(j: Int)
Run Code Online (Sandbox Code Playgroud)

我可以说:

List(1,2,3) map Foo
Run Code Online (Sandbox Code Playgroud)

哪个工作正常,相当于更冗长:

List(1,2,3) map {Foo(_)}
Run Code Online (Sandbox Code Playgroud)

但是Bar(因为它不是案例类?)不能在同一个构造中使用:

List(1,2,3) map Bar

  error: not found: value Bar
          List(1,2,3) map Bar
                          ^
Run Code Online (Sandbox Code Playgroud)

是否有一些特殊的语法来引用任何构造函数并利用eta扩展?List(1,2,3) map {new Bar(_)}与...相比似乎有点冗长Foo.

constructor scala higher-order-functions

8
推荐指数
1
解决办法
860
查看次数

如何将转换链的结果传递给函数?

我想写一个转换链,最后有一个块,我在那里用生成的集合做一些事情,而不使用变量.在集合上是否有一个更高阶的函数,它只提供它被调用到所提供函数的集合?

Query( ... )
  .map { ... }
  .filter { ... }
  .combinations(2)
  .pipeTo { col =>
     ...
     consolidate(col)
  }
Run Code Online (Sandbox Code Playgroud)

当然对于单个函数调用,可以这样做:

consolidate(
  Query()
    .map { ... }
    .filter { ... }
    .combinations(2)
)
Run Code Online (Sandbox Code Playgroud)

但是前者对我来说更自然,并允许例如容易注入一些条件.

我一直在使用的解决方法是在最后放置一个匹配子句:

Query()
  .map { ... }
  .filter { ... }
  .combinations(2)
  match { case lst =>
    ...
    consolidate(lst)
  }
Run Code Online (Sandbox Code Playgroud)

但由于这种模式经常发生,我想知道写这个的惯用方法是什么.

scala higher-order-functions

8
推荐指数
1
解决办法
1330
查看次数

是否可以使用地图定义foldr?

在我定义map使用foldr问题之后,我想到了:

如果可以定义map使用foldr,相反的是什么?

从我的观点来看,这是不可能的,但我找不到合适的解释.谢谢您的帮助!

haskell fold higher-order-functions map-function

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

如何在Typed Racket中编写将多态函数作为参数的高阶函数?

例如,我如何编写一个版本的版本map将与Typed Racket中的多态函数一起使用?我使用一个简单的id函数定义为:

(: id : (All (A) A -> A))
(define (id x) x)
Run Code Online (Sandbox Code Playgroud)

当我尝试将其映射到列表时,我收到一个错误:

> (map id '(1 2 3))

Type Checker: Polymorphic function `map' could not be applied to arguments:
Types: (-> a b ... b c) (Listof a) (Listof b) ... b -> (Listof c)
   (-> a c) (Pairof a (Listof a)) -> (Pairof c (Listof c))
Arguments: (All (A) (-> A A)) (List One Positive-Byte Positive-Byte)
Expected result: AnyValues
   in: (map id …
Run Code Online (Sandbox Code Playgroud)

types higher-order-functions racket polymorphic-functions typed-racket

8
推荐指数
1
解决办法
556
查看次数

React.cloneElement:传递新的孩子或复制props.children?

我很困惑第三个"儿童"参数React.cloneElement和它的关系this.props.children.

我在高阶组件上遵循了本指南,并具有以下代码:

render() {
    const elementsTree = super.render()

    let myPropChange = {}

    /* work on newProps... */
    myPropChange.something = "nice!".

    const newProps = Object.assign({}, elementsTree.props, myPropChange)

    /* map children */
    const newChildren = React.Children.map(elementsTree.props.children, c => something(c))

    return React.cloneElement(elementsTree, newProps, newChildren)
}
Run Code Online (Sandbox Code Playgroud)
  • 我应该将映射的孩子放入我的newProps.children或者我应该将它们作为第三个参数传递给我cloneElement吗?

  • Object.assign无论如何都要将孩子复制propsnewProps我这里,我应该跳过它们吗?

  • 在指南中说

    组件无法保证解析完整的子树.

    这在我的情况下意味着什么?那this.props.children不是吗?

  • 添加了第4个问题:为什么我要克隆道具而不是直接编辑它们?

javascript higher-order-functions reactjs

8
推荐指数
1
解决办法
5426
查看次数

懒惰评估如何允许更大的模块化?

John Hughes 在他的文章" 为什么功能编程很重要 "中辩称,"懒惰评估可能是函数式程序员模块中最强大的模块化工具." 为此,他提供了一个这样的例子:

假设您有两个函数,"infiniteLoop"和"terminationCondition".您可以执行以下操作:

terminationCondition(infiniteLoop input)
Run Code Online (Sandbox Code Playgroud)

懒惰的评价,在休斯的话中"允许终止条件与循环体分离".这绝对是正确的,因为这里使用延迟评估的"terminationCondition"意味着可以在循环外定义这个条件 - 当terminationCondition停止请求数据时,infiniteLoop将停止执行.

但高阶函数不能达到如下相同的效果吗?

infiniteLoop(input, terminationCondition)
Run Code Online (Sandbox Code Playgroud)

懒惰评估如何提供高阶函数不提供的模块化?

haskell functional-programming lazy-evaluation higher-order-functions miranda

8
推荐指数
1
解决办法
238
查看次数

我必须为TypeScript中的高阶函数类型指定参数名称吗?

试图使用TypeScript弄湿我的脚,但我一直遇到麻烦今天,一个旧功能浮出水面,并且作为练习,我很好奇是否可以将其转换为TypeScript。到目前为止,颈部已经完全疼痛。

declare type Ord = number | string;

// type signature for f sucks really bad
// (f: Ord => Ord => boolean) would be really nice, if possible
// but instead I have to give names (_) for the parameters? dumb
const arrayCompare = (f: (_: Ord) => (_: Ord) => boolean) => ([x,...xs]: Ord[]) => ([y,...ys]: Ord[]): boolean => {
  if (x === undefined && y === undefined)
    return true;
  else if …
Run Code Online (Sandbox Code Playgroud)

higher-order-functions typescript

8
推荐指数
1
解决办法
1233
查看次数

Swift是否具有像Any或All这样的短程高阶函数?

我知道Swift的高阶函数,如Map,Filter,Reduce和FlatMap,但是我不知道有什么像'All'或'Any'那样返回一个布尔值,在枚举时对正测试进行短路.结果.

例如,isFulfilled假设您拥有10,000个对象的集合,每个对象都有一个被调用的属性,并且您希望查看该集合中是否有任何对象isFulfilled设置为false.在C#中,您可以使用myObjects.Any(obj -> !obj.isFulfilled)并且当该条件被命中时,它会使枚举的其余部分短路并立即返回true.

Swift中有没有这样的东西?

short-circuiting higher-order-functions swift

8
推荐指数
1
解决办法
434
查看次数