小编Pro*_*ade的帖子

Golang混合分配和声明

我开始工作几周了,而且(再一次)我偶然发现了一些对我来说很奇怪的事情:

// Not working
a := 1
{
    a, b := 2, 3
}

// Works
a := 1
a, b := 2, 3
Run Code Online (Sandbox Code Playgroud)

操场

我想同时分配两个变量.一个已经宣布,在一个优越的范围,另一个不是.

它不起作用:编译器尝试重新声明前一个变量.但是,如果在同一范围内声明此变量,则它可以正常工作.

这是为什么 ?

variable-assignment go variable-declaration

16
推荐指数
2
解决办法
5697
查看次数

为什么这会循环'数据'而不是'newtype'?

这是代码:

import Control.Applicative

-- newtype Parser a = Parser { runParser :: String -> [(a, String)] }
data Parser a = Parser { runParser :: String -> [(a, String)] }

instance Functor Parser where
  fmap f (Parser p) = Parser (\s -> [(f x, s') | (x, s') <- p s ] )

instance Applicative Parser where
  pure a = Parser (\s -> [(a, s)])
  Parser q <*> Parser p = Parser (\s -> [(f x, s'') | (f, s') …
Run Code Online (Sandbox Code Playgroud)

haskell

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

有条件地向后或向前迭代的最快方法

我至少可以想到三种选择循环方向的方法。

两个循环,一开始有一个条件(也许是最快的?):

if (!backwards)
  for (int i = 0; i <= end; i++) {
  // code
  }
else
  for (int i = end; i >= 0; i--){
  // code
  }
Run Code Online (Sandbox Code Playgroud)

循环多个元素,在内部进行测试和增量(我使用这个):

for (int l = 0; l < max_len; l++) {
  // code
  if (!backward)
    i++;
  else
    i--;
}
Run Code Online (Sandbox Code Playgroud)

使用可变增量和最终值(也许是最糟糕的?)

if (backward)
  inc = -1;
else
  inc = 1;
for (int i = 0; i != end; i += inc) {
  // code
}
Run Code Online (Sandbox Code Playgroud)

哪种方式更快?编译器是否在每种情况下都对其进行优化?

c optimization loops

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