我写了这个函数来获取数组的子集.php是否具有内置功能.我在文档中找不到一个.如果我重新发明轮子,似乎是浪费.
function array_subset($array, $keys) {
$result = array();
foreach($keys as $key){
$result[$key] = $array[$key];
}
return $result;
}
Run Code Online (Sandbox Code Playgroud) 我正在开发一个Clojure项目,我经常发现自己正在为DSL编写Clojure宏,但我正在观看Clojure视频,了解公司如何在实际工作中使用Clojure,而且发言人说在实际使用中他们不使用宏来实现他们的DSL,他们只使用宏来添加一点句法.这是否意味着我应该使用标准函数编写我的DSL,然后在最后添加一些宏?
更新:在阅读了这个问题的许多不同(和有趣的)回答后,我意识到答案并不像我最初想的那样明确,原因有很多:
应用程序中有许多不同类型的API(内部,外部)
API的用户有很多种类(商业用户只想快速完成某项工作,Clojure专家)
是否有宏隐藏锅炉板代码?
我会离开并更深入地思考这个问题,但感谢你的回答,因为他们给了我很多思考.另外我注意到Paul Graham认为与Christophe视频相反,并认为宏应该是代码库的很大一部分(25%):
我如何编写一个函数,它接受一个类型的函数元组,ai -> b -> ai并返回一个函数,该函数接受类型元素的元组,类型的ai一个元素b,并将每个元素组合成一个新的元组ai:
那就是签名应该是这样的
f :: (a1 -> b -> a1, a2 -> b -> a2, ... , an -> b -> an) ->
(a1, a2, ... , an) ->
b ->
(a1, a2, ... , an)
Run Code Online (Sandbox Code Playgroud)
这样:
f (min, max, (+), (*)) (1,2,3,4) 5 = (1, 5, 8, 20)
Run Code Online (Sandbox Code Playgroud)
关键是我可以写:
foldlMult' t = foldl' (f t)
Run Code Online (Sandbox Code Playgroud)
然后做一些像:
foldlMult' (min, max, (+), (*)) (head x, head x, 0, 0) x …Run Code Online (Sandbox Code Playgroud) 我一直在阅读一个wreq教程:
镜头提供了一种聚焦于Haskell值的一部分的方法.例如,该
Response类型具有responseStatus镜头,其关注于服务器返回的状态信息.Run Code Online (Sandbox Code Playgroud)ghci> r ^. responseStatus Status {statusCode = 200, statusMessage = "OK"}在
^.操作者需要一个值作为第一个参数,一个透镜作为其第二个,并返回聚焦值的该部分上由透镜.我们使用功能组合构成镜头,这使我们可以轻松地专注于深层嵌套结构的一部分.
Run Code Online (Sandbox Code Playgroud)ghci> r ^. responseStatus . statusCode 200
我无法想出如何使用这个参数顺序完成的函数组合可以按顺序处理嵌套结构.
看:r ^. responseStatus . statusCode可能是r ^. (responseStatus . statusCode)或者(r ^. responseStatus) . statusCode.
在第一个中我们构造了一个函数,它首先处理statusCode(从记录中获取它Status? - 因为我可以从显示的值中推导出来Status {statusCode = 200, statusMessage = "OK"}),然后将它传递给responseStatus必须处理响应状态的函数.所以,反过来说:实际上,状态代码是响应状态的一部分.
第二读对我来说也没有意义,因为它也首先处理状态代码.
haskell records function-composition higher-order-functions lenses
我在Haskell 遇到了这个结构.我找不到任何关于如何在实际代码中使用zap/ zapWith和bizap/的示例或解释bizapWith.它们在某种程度上与标准zip/ zipWith功能相关吗?如何在Haskell代码中使用Zap/ Bizapfunctor?他们有什么好处?
haskell functional-programming functor category-theory higher-order-functions
来自Javascript我明白Haskell的列表类型强制实施同类列表.现在让我感到惊讶的是,以下不同的功能类型满足此要求:
f :: (a -> a) -> a -> a
f g x = g x
g :: (a -> b) -> a -> b
g h x = h x
let xs = [f, g] -- type checks
Run Code Online (Sandbox Code Playgroud)
即使g比f以下更广泛适用:
f(\x -> [x]) "foo" -- type error
g(\x -> [x]) "foo" -- type checks
Run Code Online (Sandbox Code Playgroud)
不(a -> a)应该比不加善待(a -> b).在我看来,好像后者是前者的子类型.但是Haskell中没有子类型关系,对吧?那么为什么这样呢?
我通常使用组件组合来重用逻辑React方式.例如,这是一个关于如何将交互逻辑添加到组件的简化版本.在这种情况下,我会CanvasElement选择:
CanvasElement.js
import React, { Component } from 'react'
import Selectable from './Selectable'
import './CanvasElement.css'
export default class CanvasElement extends Component {
constructor(props) {
super(props)
this.state = {
selected: false
}
this.interactionElRef = React.createRef()
}
onSelected = (selected) => {
this.setState({ selected})
}
render() {
return (
<Selectable
iElRef={this.interactionElRef}
onSelected={this.onSelected}>
<div ref={this.interactionElRef} className={'canvas-element ' + (this.state.selected ? 'selected' : '')}>
Select me
</div>
</Selectable>
)
}
}
Run Code Online (Sandbox Code Playgroud)
Selectable.js
import { Component } from 'react'
import PropTypes from 'prop-types' …Run Code Online (Sandbox Code Playgroud) javascript composition higher-order-functions reactjs higher-order-components
我有许多高阶实用程序函数,它们接受代码引用并将该代码应用于某些数据.其中一些函数需要在执行子例程期间本地化变量.开始时,我正在使用caller以与此示例reduce函数中所示类似的方式确定要本地化的包:
sub reduce (&@) {
my $code = shift;
my $caller = caller;
my ($ca, $cb) = do {
no strict 'refs';
map \*{$caller.'::'.$_} => qw(a b)
};
local (*a, *b) = local (*$ca, *$cb);
$a = shift;
while (@_) {
$b = shift;
$a = $code->()
}
$a
}
Run Code Online (Sandbox Code Playgroud)
最初这种技术运行良好,但是当我尝试围绕高阶函数编写包装函数时,找出正确的调用者变得复杂.
sub reduce_ref (&$) {&reduce($_[0], @{$_[1]})}
Run Code Online (Sandbox Code Playgroud)
现在为了reduce工作,我需要这样的东西:
my ($ca, $cb) = do {
my $caller = 0;
$caller++ while caller($caller) =~ /^This::Package/;
no strict …Run Code Online (Sandbox Code Playgroud) 我不明白使用arity> 1编写函数.在ghci 7.4.1我输入:
((*).succ) 3 4
> 16
Run Code Online (Sandbox Code Playgroud)
我并不完全理解数学变换,但很明显它与数学变换相同
(*) (succ 3) 4
Run Code Online (Sandbox Code Playgroud)
但当我这样做时:
( (\x y z -> x).(\a b -> a*b) ) 2 3 4 5
> 10
( (\x y z -> y).(\a b -> a*b) ) 2 3 4 5
> No instance for (Num (a0 -> t0))
Run Code Online (Sandbox Code Playgroud)
现在我完全迷失了.有人能解释会发生什么吗?PS.我知道haskell中的所有内容只有1个参数,但它并没有真正帮助我:)
filter在Emacs Lisp中是否有相当于高阶函数的东西?喜欢python或Javascript的功能.
(filter-equivalent (lambda (n) (= (% n 2) 0)) '(1 2 3 4 5 6 7 8))
==> (2 4 6 8)
Run Code Online (Sandbox Code Playgroud)