小编hug*_*omg的帖子

采用Python

我今天开始阅读关于underscore.js的文章,它是一个javascript库,它添加了一些我习惯在Python中使用的函数式编程好东西.一个非常酷的速记方法是采摘.

确实在Python中我经常需要挖掘一些特定的属性,并最终做到这一点:

users = [{
    "name" : "Bemmu",
    "uid" : "297200003"
},
{
    "name" : "Zuck",
    "uid" : "4"
}]
uids = map(lambda x:x["uid"], users)
Run Code Online (Sandbox Code Playgroud)

如果下划线速记在Python中的某处,那么这是可能的:

uids = pluck(users, "uid")
Run Code Online (Sandbox Code Playgroud)

添加它当然是微不足道的,但是在Python的某个地方已经存在了吗?

python functional-programming

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

在Javascript中,将三元运算符的"?"放在下一行是否可以?

我真的喜欢调整?以及我的三元运算符,当它们不适合一条线时,如下所示:

var myVar = (condition
    ? ifTrue
    : ifFalse
);
Run Code Online (Sandbox Code Playgroud)

然而,JSHint抱怨:

在"?"之前坏线断线

JSHint为什么会有此警告?是否有任何讨厌(如分号插入等)它是在保护我,还是我可以安全地更改我的JSHINT配置以忽略它?

javascript jshint

32
推荐指数
4
解决办法
1万
查看次数

为什么Haskell在声明类实例时不允许使用Type Synonyms?

虽然我知道GHC 中有一个TypeSynonymInstances扩展,我不知道它是多么"危险",我想知道这种限制是否是任意的,有点像单态限制,或者是否有更深层次的原因.

haskell typeclass

32
推荐指数
3
解决办法
5907
查看次数

使用带有fallthrough的开关来处理Javascript中的默认参数是一个好主意吗?

我最近了解到,您可以使用带有fallthrough的简洁switch语句在Javascript中设置默认参数值:

function myFunc(arg1, arg2, arg3) {
    //replace unpassed arguments with their defaults:
    switch (arguments.length) {
        case 0 : arg1 = "default1";
        case 1 : arg2 = "default2";
        case 2 : arg3 = "default3";
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经成长为喜欢它,因为它不仅非常短,而且它也基于实际传递的参数而工作,而不依赖于一个特殊的值类(null,falsy等)作为占位符,就像在更传统的版本:

function myFunc(arg1, arg2, arg3){
    //replace falsy arguments with their defaults:
    arg1 = arg1 || "default1";
    arg2 = arg2 || "default2";
    arg3 = arg3 || "default3";
}
Run Code Online (Sandbox Code Playgroud)

我看到使用开关的版本之后我的初衷是我应该考虑在||版本上"默认"使用它.

开关虽然不会长得多,但它具有更加"稳健"的优点,因为它不关心参数的类型.在一般情况下,每当我必须使用默认参数创建函数时,不必担心所有伪值('',0,null,false ...)会发生什么,这听起来是个好主意.

然后,我会保留arg = arg || x实际情况,我想检查真实性,而不是将其重新用作参数默认的一般规则.

但是,当我进行代码搜索时,我发现这种模式的例子很少,所以我不得不戴上我的怀疑帽.为什么我没有找到这个成语的更多例子? …

javascript default-value argument-passing

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

有没有办法在Haskell中模拟线性类型?

我正在建模一个系统,该系统具有创建资源的操作以及使用该资源的其他操作.但是,给定的资源只能被使用一次 - 有没有一种方法可以保证在编译时?

具体来说,让我们说第一次操作烤蛋糕,还有另外两种操作,一种用于"选择吃"蛋糕,一种用于"选择吃蛋糕",我只能做一种或另一种.

-- This is my current "weakly typed" interface:
bake :: IO Cake
eat  :: Cake -> IO ()
keep :: Cake -> IO ()

-- This is OK
do
  brownie <- bake
  muffin <- bake
  eat brownie
  keep muffin

-- Eating and having the same cake is not OK:
do
  brownie <- bake
  eat brownie
  keep brownie -- oops! already eaten!
Run Code Online (Sandbox Code Playgroud)

通过在我们使用之后在蛋糕上设置标记,很容易强制执行限制,即不在运行时保留已经吃过的蛋糕(反之亦然).但有没有办法在编译时强制执行此操作?

顺便说一句,这个问题是为了概念证明,所以我可以使用任何可以给我静电安全的黑魔法.

haskell types linear-types

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

为什么我可以隐式地将int文字转换为C中的int*而不是C++中的int*?

我相信在下面的代码中,C"自动转换为17 int *",正如有人最近指出的那样(但没有说明原因),这是错误的.

int *ptoi = 17; // I assumed that 17 is being automatically casted to int *
Run Code Online (Sandbox Code Playgroud)

我知道如果我在C++中做同样的事情,我会收到一个错误invalid conversion from int to int *.但是,如果我在C++中执行以下操作,它可以正常工作:

int *ptoi = (int *)17;
Run Code Online (Sandbox Code Playgroud)

这些是我认为在C中,铸造是隐含的原因.

有人可以解释为什么,在C++中,我必须使用它,但在C中,它工作正常吗?

c c++ pointers casting

25
推荐指数
1
解决办法
4504
查看次数

在 github 操作工作流中,有没有办法让多个作业重用相同的设置?

我最近将我的项目与 github 操作连接起来以进行持续集成。我创建了两个单独的作业:第一个检查拉取请求中的代码是否被我们的 linter 接受,第二个检查代码是否通过了测试套件。我喜欢这样的两个工作在 Github 网页中显示为拉取请求的两个单独的复选标记:

在此处输入图片说明

我现在遇到的问题是工作流 YAML 文件中有一些重复的代码:前 3 个步骤,安装 Lua 和 Luarocks。不仅维护起来很烦人,而且两次运行相同的操作也会浪费 CI 分钟。有没有办法避免这种情况?这样设置代码只写在一个地方,并且只在工作流执行时运行一次

但我很困惑什么是正确的方法:

  1. 我应该使用共享设置代码创建自己的 Github Action 吗?
  2. 我应该创建一个已经预先安装了 Lua 和 Luarocks 的 Docker 镜像吗?
  3. 我应该使用单个作业吗?如果 linter 和测试套件是同一个工作的步骤,我是否仍然可以有独立的复选标记?
  4. 还有什么?

这是我的工作流程的当前 YAML 文件:

name: Github Actions CI

on: [ pull_request ]

jobs:
    lint:
        name: Lint
        runs-on: ubuntu-latest
        steps:
            - uses: actions/checkout@v2
            - uses: leafo/gh-actions-lua@v8.0.0
            - uses: leafo/gh-actions-luarocks@v4.0.0

            - run: luarocks install luacheck
            - run: ./run-linter.sh

    test:
        name: …
Run Code Online (Sandbox Code Playgroud)

github-actions

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

Javascript中函数参数的评估顺序是什么?

根据我的测试,它总是从左到右

>> console.log( console.log(1), console.log(2) );
1
2
undefined undefined
Run Code Online (Sandbox Code Playgroud)

但我找不到相关部分在ECMAScript标准中确认这一点.

javascript

21
推荐指数
3
解决办法
3940
查看次数

是否可以在lambda表达式中使用无可辩驳的波浪号(`~`)模式?

GHC给了我一个parse error on input \~如果我尝试在lambda表达式的模式上使用波形符,就像我可以用命名函数做的那样

let step = \~(x,s) -> run (f x) s  -- Parse Error

let step ~(x, s) = run (f x) s -- Works fine
Run Code Online (Sandbox Code Playgroud)

haskell pattern-matching

21
推荐指数
1
解决办法
560
查看次数

有没有办法让JSHint的"变量已定义"警告?

如果我有多个for循环声明相同的索引变量,JSHint会抱怨:

for(var i=0; i<10; i++){
    console.log(i);
}

for(var i=0; i<10; i++){   //<-- jshint warns that 'i' is already defined
    console.log(i);
}
Run Code Online (Sandbox Code Playgroud)

有没有办法关闭此警告?我搜索时找不到任何东西......

我想这样做的原因是我更喜欢将我的索引变量与循环一起声明,而不是将声明提升到函数的顶部.我认为重复声明是更强大的,如果我删除for循环或移动它们,我也认为它有助于传达循环变量不应该在循环外使用的意图.

javascript jshint

20
推荐指数
1
解决办法
6168
查看次数