标签: idiomatic

惯用法Scala解决命令式代码

在'惯用'Scala中表达此功能有哪些想法.或者更确切地说,有没有办法在不牺牲可读性的情况下删除本地变量?

def solve(threshold: Int)(f: Int => Int): Int = {
  var sum = 0
  var curr = 0
  while(sum < threshold) {
   sum += f(curr)
   curr += 1
  }
  curr
}
Run Code Online (Sandbox Code Playgroud)

我唯一想到的就是这个,但在我看来它更长,更不易读.

def solve2(threshold: Int)(f: Int => Int): Int = {
  val resultIterator = Iterator.iterate (0, 0) { case (curr, sum) =>
    (curr + 1, sum + f(curr))
  }
  (resultIterator find (_._2 >= threshold)).get._1
}
Run Code Online (Sandbox Code Playgroud)

algorithm collections scala idiomatic

9
推荐指数
3
解决办法
415
查看次数

在OCaml中退出循环的惯用例外

在OCaml中,可以通过引发异常提前退出命令式循环.

虽然在OCaml中使用命令式循环本身并不是惯用语,但我想知道在早期退出时模拟命令式循环的最惯用方法是什么(考虑到性能等方面,如果可能的话).

例如,旧的OCaml FAQ提到例外Exit:

Exit:用于跳出循环或函数.

它仍然是最新的吗?该标准库简单地提到它作为一个通用的异常:

Exit异常没有被任何库函数提高.它可以在您的程序中使用.

与此相关,这个回答另外一个问题提到使用预计算let exit = Exit例外,以避免在循环中分配.它还需要吗?

此外,有时人们想要从具有特定值的循环中退出,例如raise (Leave 42).是否有惯用的例外或命名约定来执行此操作?在这种情况下我应该使用引用(例如let res = ref -1 in ... <loop body> ... res := 42; raise Exit)吗?

最后,Exit在嵌套循环中的使用可以防止某些人想要退出几个循环的情况,比如break <label>在Java中.这将需要定义具有不同名称的异常,或者至少使用整数来指示应退出多少范围(例如Leave 2,指示应退出2个级别).同样,这里有一个惯用的方法/异常命名吗?

ocaml loops idiomatic imperative-programming

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

在C++中为什么我们不能使用>和<?来比较迭代器?

我被问到这个问题我不知道为什么.

如果你有一个指针int * x;
可以比拟的指针><,因为它代表的内存位置类似0x0000 0x0004 0x0008,等我知道迭代器和指针是不同的,但他们以非常相似的方式行事.

例如:

vector<int> myVector;

for(int i = 1; i < 101; i++)
{
    myVector.push_back(i);
}

vector<int>::iterator it = myVector.begin();
while(it != myVector.end()) //Why can't we write it < myVector.end()
{
    cout << *it << endl;
    it++;
}
Run Code Online (Sandbox Code Playgroud)

为什么我们不能< myVector.end()while声明中写出来?我知道这与STL中没有超载有关.然而,写作是&*it < &*myVector.end()有效的,因为它获得了显示说话的内存位置0x0004 0x0008等.

为什么是这样?

c++ syntax iterator loops idiomatic

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

使用std :: byte标准化,我们何时使用void*和一个字节*?

C++ 17将包括std::byte一种用于一个可原子寻址的存储器单元的类型,在典型的计算机上具有8位.

在这种标准化之前,指向"原始"内存时已经存在一些困境 - 在一方面使用char*/ unsigned char*另一方面void *.现在,void *删除了偏好的原因之一- std::byte没有与a相同的内涵char; 它是关于原始内存,而不是字符.

所以,我的问题是:什么是一个很好的经验法则std::byte,关于何时更喜欢它void *以及什么时候相反?


当然,当你处理旧代码或C代码时,你会受到它所接受的约束; 我主要是指新代码,您可以选择所有类型.

c++ byte idiomatic c++17

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

Clojure中的惯用语:(降1 str)或(休息str)?

这里简单的问题是Clojure.处理字符串时哪个更惯用?在处理其他数据类型时哪个更惯用?哪个更有效率?

(drop 1 str)
Run Code Online (Sandbox Code Playgroud)

要么

(rest str)
Run Code Online (Sandbox Code Playgroud)

idiomatic clojure

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

什么是惯用的clojure:使用

我已经:use在clojure中看到了几种不同的方法- 什么是惯用/首选方法?

#1

(ns namespace.core
  (:use [[something.core]
         [another.core]]))
Run Code Online (Sandbox Code Playgroud)

或#2编辑:与此一起使用:only.

(ns namespace.core
  (:use [something.core]
        [another.core]))
Run Code Online (Sandbox Code Playgroud)

或#3

(ns namespace.core
  (:use [something.core
         another.core]))
Run Code Online (Sandbox Code Playgroud)

或#4

(ns namespace.core
  (:use (something.core
         another.core)))
Run Code Online (Sandbox Code Playgroud)

或#5编辑:这是惯用的,但应该:use像#2一样使用

(ns namespace.core
  (:use something.core
        another.core))
Run Code Online (Sandbox Code Playgroud)

idiomatic clojure

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

Symfony框架; 存储用户角色的惯用方法

在我的Symfony 2应用程序中,我想使用标准的用户和角色授权系统(http://symfony.com/doc/2.0/book/security.html)

我的用户是存储在具有doctrine(实现用户界面)的数据库中的实体.我将在我的系统中有5个预定义角色,每个用户可能有多个这些角色.

实现这一目标的最惯用方法是什么?我在考虑以下三种解决方案.

  1. 创建单独的Role实体并与用户实体创建多对多关系

    • 另外:轻松获得具有特定角色的所有用户
    • 骗局:资源密集型?(始终需要双联接才能获得用户的所有角色)
    • 骗局:不是自我?角色的数量(及其名称)永远不会改变,因此将其作为单独的实体存储在数据库中是否有意义?
  2. 在用户中有一个字段,它是一个排序的逗号分隔的角色列表,getRoles()实现为 explode(',',this.all_roles)

    • 加:计算成本不高
    • Con:很难让所有用户都具有特定的角色
    • Con:像这样的数据库字段让小猫哭(normalizaition和stuff)
  3. 每个角色的用户实体中有5个二进制字段

    • 加:计算成本不高
    • 另外:轻松获得具有特定角色的所有用户
    • 骗局:这仍然感觉不太好

实现这个系统最常用的方法是什么?

php authorization idiomatic symfony doctrine-orm

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

python惯用python for循环if else语句

如何else在惯用的Python for循环中使用语句?没有else我可以写例如:

res = [i for i in [1,2,3,4,5] if i < 4]
Run Code Online (Sandbox Code Playgroud)

结果是: [1, 2, 3]

上述代码的正常形式是:

res = []
for i in [1,2,3,4,5]:
    if i < 4:
        res.append(i)
Run Code Online (Sandbox Code Playgroud)

结果与惯用形式相同: [1, 2, 3]

我想要这个:

res = [i for i in [1,2,3,4,5] if i < 4 else 0]
Run Code Online (Sandbox Code Playgroud)

我得到SyntaxError: invalid syntax.结果应该是:[1, 2, 3, 0, 0] 正常的代码是:

res = []
for i in [1,2,3,4,5]:
    if i < 4:
        res.append(i)
    else:
        res.append(0)
Run Code Online (Sandbox Code Playgroud)

结果是: [1, …

python for-loop if-statement idiomatic

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

在一个语句中执行映射查找和类型断言是"糟糕的形式"吗?

我刚刚意识到可以在一个语句中进行映射查找和类型/接口断言.

m := map[string]interface{}{
    "key": "the value",
}
if value, ok := m["key"].(string); ok {
    fmt.Printf("value exists and is a string: %s\n", value)
} else {
    fmt.Println("value does not exist or is not a string")
}
Run Code Online (Sandbox Code Playgroud)

这被认为是坏事吗?我没有看到任何官方文件评论这一点.

编辑:我知道这段代码无法区分"密钥不存在"和"值是不正确的类型".

edit2:ahem,else子句中的print是不正确的:(

dictionary idiomatic go type-assertion

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

在列表理解中使用许多相同生成器的惯用方法

在Statistics课程中,我的老师向我们展示了两个骰子的所有可能卷的概率模型,增加到4.记住Haskell列表推导非常棒,我决定将它带到下一步并编写此代码以查找所有可能增加10个骰子的4个骰子:

[(d1,d2,d3,d4) | d1 <- [1..6], d2 <- [1..6], d3 <- [1..6], d4 <- [1..6], (d1 + d2 + d3 + d4) == 10]

这按预期工作,给我输出

[(1,1,2,6),(1,1,3,5),(1,1,4,4),(1,1,5,3),(1,1,6,2) ,(1,2,1,6),(1,2,2,5),(1,2,3,4),(1,2,4,3),(1,2,5,2) ,(1,2,6,1),(1,3,1,5),(1,3,2,4),(1,3,3,3-),(1,3,4,2) ,(1,3,5,1),(1,4,1,4),(1,4,2,3),(1,4,3,2),(1,4,4,1) ,(1,5,1,3),(1,5,2,2),(1,5,3,1),(1,6,1,2),(1,6,2,1) ,(2,1,1,6),(2,1,2,5),(2,1,3,4),(2,1,4,3),(2,1,5,2) ,(2,1,6,1),(2,2,1,5),(2,2,2,4),(2,2,3,3),(2,2,4,2) ,(2,2,5,1),(2,3,1,4),(2,3,2,3),(2,3,3,2),(2,3,4,1) ,(2,4,1,3),(2,4,2,2),(2,4,3,1),(2,5,1,2),(2,5,2,1) ,(2,6,1,1),(3,1,1,5),(3,1,2,4),(3,1,3,3),(3,1,4,2) ,(3,1,5,1),(3,2,1,4),(3,2,2,3),(3,2,3,2),(3,2,4,1) ,(3,3,1,3),(3,3,2,2),(3,3,3,1),(3,4,1,2),(3,4,2,1) ,(3,5,1,1),(4,1,1,4),(4,1,2,3),(4,1,3,2),(4,1,4,1) ,(4,2,1,3),(4,2,2,2),(4,2,3,1),(4,3,1,2),(4,3,2,1) ,(4,4,1,1),(5,1,1,3),(5,1,2,2),(5,1,3,1),(5,2,1,2) ,(5,2,2,1),(5,3,1,1),(6,1,1,2),(6,1,2,1),(6,2,1,1) ]

这就是我的问题所在.Ruby是我背景的重要组成部分,因此我对DRY原则非常重视.有d1 <- [1..6], d2 <- [1..6], d3 <- [1..6], d4 <- [1..6]在我的代码似乎没有必要,我愿意相信有一个更好的方式来做到这一点.

据我所知,我当前的方法通过在幕后运行4个嵌套循环来实现 - 每个生成器一个.有没有办法让一个<- [1..6]生成器适用于所有变量,有效地创建4个嵌套循环?如果没有,是否有更少冗余或惯用的方式编写此代码以实现相同的结果?

注意:我对这门语言很陌生,所以如果这是显而易见的话我会道歉.如果您使用任何新手命令式/面向对象程序员不熟悉的单词/概念,请尝试为我解释它们.

haskell list-comprehension idiomatic

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