我开始工作几周了,而且(再一次)我偶然发现了一些对我来说很奇怪的事情:
// Not working
a := 1
{
a, b := 2, 3
}
// Works
a := 1
a, b := 2, 3
Run Code Online (Sandbox Code Playgroud)
我想同时分配两个变量.一个已经宣布,在一个优越的范围,另一个不是.
它不起作用:编译器尝试重新声明前一个变量.但是,如果在同一范围内声明此变量,则它可以正常工作.
这是为什么 ?
这是代码:
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) 我至少可以想到三种选择循环方向的方法。
两个循环,一开始有一个条件(也许是最快的?):
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)
哪种方式更快?编译器是否在每种情况下都对其进行优化?