似乎模板Haskell经常被Haskell社区视为一种不幸的便利.我很难准确地说出我在这方面所观察到的内容,但请考虑这几个例子
我已经看过各种博客文章,其中人们使用模板Haskell做了相当简洁的东西,实现了更好的语法,这在常规的Haskell中是不可能的,以及巨大的样板减少.那么为什么模板Haskell以这种方式受到鄙视呢?是什么让它不受欢迎?在什么情况下应避免模板Haskell,为什么?
我长期以来一直认为,goto如果可能的话,永远不应该使用它.在前几天阅读libavcodec(用C语言编写)时,我注意到它的多种用途.goto在支持循环和函数的语言中使用是否有利?如果是这样,为什么?
我有一些我绝对必须使用的代码goto.例如,我想写一个这样的程序:
start:
alert("RINSE");
alert("LATHER");
repeat: goto start
Run Code Online (Sandbox Code Playgroud)
有没有办法在Javascript中这样做?
可能重复:
为什么使用goto不好?
GOTO仍被视为有害吗?
我通过xkcd进行了调整,看到了这个(几年前还读了一些关于它们的负面文章):

这究竟是什么问题?为什么goto甚至可以在C++中使用呢?
我为什么不使用它们?
这是我作为一个经验不足的程序员经常遇到的情况,我特别想知道我正在努力优化的一个雄心勃勃,速度密集的项目.对于主要的类C语言(C,objC,C++,Java,C#等)及其常用的编译器,这两个函数是否同样有效运行?编译代码有什么区别吗?
void foo1(bool flag)
{
if (flag)
{
//Do stuff
return;
}
//Do different stuff
}
void foo2(bool flag)
{
if (flag)
{
//Do stuff
}
else
{
//Do different stuff
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,是否有提前break或return早期的直接效率奖金/罚款?堆栈框架是如何涉及的?是否有优化的特殊情况?是否有任何因素(如内联或"Do stuff"的大小)可能会对此产生重大影响?
我总是支持改进可读性而非次要优化(我通过参数验证看到foo1很多),但这种情况经常发生,我想一劳永逸地抛开所有的担忧.
而且我知道过早优化的陷阱......呃,这些都是一些痛苦的回忆.
编辑:我接受了答案,但EJP的答案非常简洁地解释了为什么使用a return几乎可以忽略不计(在汇编中,return在函数末尾创建一个'分支',这非常快.分支改变了PC寄存器和也可能会影响缓存和管道,这是非常小的.)特别是对于这种情况,它实际上没有区别,因为它们if/else和return函数末尾都创建了相同的分支.
谷歌的Go语言是一种新语言.因此,我惊讶地发现它有一个'goto'声明.我一直被教导说'goto'语句已成为过去,而且它会使程序的实际流程陷入窘境.功能(或方法,如果你愿意)总是一种更好的控制流量的方法.
我肯定错过了什么.为什么以及何时使用'goto'是一个好主意?或者谷歌为什么要加入它?
在做了一些关于如何突破二次循环的研究之后
while (true) { // Main Loop
for (int I = 0; I < 15; I++) { // Secondary loop
// Do Something
break; // Break main loop?
}
}
Run Code Online (Sandbox Code Playgroud)
大多数人建议调用'goto'函数
看如下例:
while (true) { // Main Loop
for (int I = 0; I < 15; I++) { // Secondary Loop
// Do Something
goto ContinueOn; // Breaks the main loop
}
}
ContinueOn:
Run Code Online (Sandbox Code Playgroud)
然而; 我经常听说'goto'声明是不好的做法.下图完美地说明了我的观点:

对于这个程序:
class Program
{
static void Main(string[] args)
{
var state = States.One;
switch (state)
{
case States.One:
Console.WriteLine("One");
break;
case States.Zero:
goto case States.One;
}
}
}
public enum States : ulong
{
Zero = 0,
One = 1,
}
Run Code Online (Sandbox Code Playgroud)
我有:
"switch表达式或case标签必须是bool,char,string,integral,enum或相应的可空类型"
但state变量是enum类型.如果我评论该goto case行,错误就会消失.
我正在使用VS 2013. + .NET 4.5.1.
应该简单快捷:我想要一个与以下Java代码等效的C#:
orig: for(String a : foo) {
for (String b : bar) {
if (b.equals("buzz")) {
continue orig;
}
}
// other code comes here...
}
Run Code Online (Sandbox Code Playgroud)
编辑:好吧,似乎没有这样的等价物(嘿 - Jon Skeet自己说没有,这就解决了;)).所以我的"解决方案"(在其Java等价物中)是:
for(String a : foo) {
bool foundBuzz = false;
for (String b : bar) {
if (b.equals("buzz")) {
foundBuzz = true;
break;
}
}
if (foundBuzz) {
continue;
}
// other code comes here...
}
Run Code Online (Sandbox Code Playgroud) 我有一个代码用于将我的应用程序资源更新为当前应用程序版本 应用程序更新后调用此代码.
int version = 1002; // current app version
switch(version)
{
case 1001:
updateTo1002();
goto case 1002;
case 1002:
updateTo1003();
goto case 1003;
case 1003:
updateTo1004();
goto case 1004;
break;
case 1004:
updateTo1005();
break;
}
Run Code Online (Sandbox Code Playgroud)
这里我们通过跳转到指定的case块来调用cascade方法.我想知道 - 在这种情况下,使用go(通常被视为这种不良做法!)是一种好习惯吗?我不想一个接一个地调用方法 - 像这样:
updateTo1002()
{
// do the job
updateTo1003();
}
updateTo1003()
{
// do the job
updateTo1004();
}
Run Code Online (Sandbox Code Playgroud)
有没有设计模式描述这样的问题?