作为练习,我重写了一些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,但我的整体应用程序CPU高出近30%.
如果我filter写错了,请帮助我理解我的错误.否则请指出为什么Swift的filterCPU负载比我的减少了30%.
我一直在阅读关于组合器的信息,看看它们有多大用处(例如,在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
有两个简单的类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.
我想写一个转换链,最后有一个块,我在那里用生成的集合做一些事情,而不使用变量.在集合上是否有一个更高阶的函数,它只提供它被调用到所提供函数的集合?
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)
但由于这种模式经常发生,我想知道写这个的惯用方法是什么.
在我定义map使用foldr问题之后,我想到了:
如果可以定义map使用foldr,相反的是什么?
从我的观点来看,这是不可能的,但我找不到合适的解释.谢谢您的帮助!
例如,我如何编写一个版本的版本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
我很困惑第三个"儿童"参数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无论如何都要将孩子复制props到newProps我这里,我应该跳过它们吗?
在指南中说
组件无法保证解析完整的子树.
这在我的情况下意味着什么?那this.props.children不是吗?
添加了第4个问题:为什么我要克隆道具而不是直接编辑它们?
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
试图使用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) 我知道Swift的高阶函数,如Map,Filter,Reduce和FlatMap,但是我不知道有什么像'All'或'Any'那样返回一个布尔值,在枚举时对正测试进行短路.结果.
例如,isFulfilled假设您拥有10,000个对象的集合,每个对象都有一个被调用的属性,并且您希望查看该集合中是否有任何对象isFulfilled设置为false.在C#中,您可以使用myObjects.Any(obj -> !obj.isFulfilled)并且当该条件被命中时,它会使枚举的其余部分短路并立即返回true.
Swift中有没有这样的东西?
haskell ×3
scala ×2
swift ×2
combinators ×1
constructor ×1
filter ×1
fold ×1
instruments ×1
javascript ×1
map-function ×1
miranda ×1
racket ×1
reactjs ×1
typed-racket ×1
types ×1
typescript ×1