Можете ли вы написать какой-либо алгоритм без оператора if? - PullRequest
30 голосов
/ 21 декабря 2009

Этот сайт щекотал мое чувство юмора - http://www.antiifcampaign.com/ но может ли полиморфизм работать в каждом случае, когда вы используете оператор if?

Ответы [ 18 ]

1 голос
/ 21 декабря 2009

Haskell даже не имеет операторов if, будучи чисто функциональным. ; D * * тысяча одна

1 голос
/ 21 декабря 2009

Это на самом деле игра в кодирование, в которую я люблю играть с языками программирования. Он называется «если бы у нас не было if», который берет свое начало в: http://wiki.tcl.tk/4821

По сути, если мы запрещаем использование условных конструкций в языке: нет, если, нет, пока, нет, для, если нет, без переключателя и т. Д., Мы можем воссоздать нашу собственную функцию IF. Ответ зависит от языка и от того, какие языковые особенности мы можем использовать (помните, что использование обычных условных конструкций обманывает без троичных операторов!)

Например, в tcl имя функции - это просто строка, и любая строка (включая пустую строку) разрешена для чего угодно (имена функций, имена переменных и т. Д.). Итак, используя это, мы можем сделать:

proc 0 {true false} {uplevel 1 $false; # execute false code block, ignore true}
proc 1 {true false} {uplevel 1 $true;  # execute true code block, ignore flase}

proc _IF {boolean true false} {
    $boolean $true $false
}

#usage:
_IF [expr {1<2}] {
    puts "this is true"
} {
  #else:
    puts "this is false"
}

или в javascript мы можем злоупотреблять свободным набором текста и тем фактом, что почти все может быть преобразовано в строку, и объединить это с его функциональной природой:

function fail (discard,execute) {execute()}
function pass (execute,discard) {execute()}
var truth_table = {
    'false' : fail,
    'true' : pass
}
function _IF (expr) {
  return truth_table[!!expr];
}

//usage:
_IF(3==2)(
    function(){alert('this is true')},
//else
    function(){alert('this is false')}
);

Не все языки могут делать подобные вещи. Но языки, которые мне нравятся, как правило, способны.

1 голос
/ 21 декабря 2009

Вы можете сделать это без if как таковое, но вы не можете сделать это без механизма, который позволяет вам принимать решение на основе некоторого условия.

В сборке нет оператора if. Есть условные прыжки.

Например, в Haskell нет явного if, вместо этого вы определяете функцию несколько раз, я забыл точный синтаксис, но это что-то вроде этого:

псевдо-Haskell:

def posNeg(x < 0):
    return "negative"

def posNeg(x == 0):    
    return "zero"

def posNeg(x):
    return "positive"

Когда вы вызываете posNeg(a), интерпретатор посмотрит на значение a, если это < 0, тогда он выберет первое определение, если это == 0, то выберет второе определение, иначе по умолчанию будет третье определение.

Так что, хотя языки, такие как Haskell и SmallTalk, не имеют обычного оператора в стиле C if, у них есть другие средства, позволяющие вам принимать решения.

0 голосов
/ 31 марта 2015

Я думал о добавлении двух моих центов: вы можете оптимизировать ifs во многих языках, где вторая часть логического выражения не оценивается, если это не повлияет на результат.

С оператором and, если первый операнд оценивается как false, тогда нет необходимости оценивать второй. С оператором or все наоборот - нет необходимости оценивать второй операнд, если первый - true. Некоторые языки всегда ведут себя так, другие предлагают альтернативный синтаксис.

Вот код if - elseif - else, созданный в JavaScript с использованием только операторов и анонимных функций.

document.getElementById("myinput").addEventListener("change", function(e) {

  (e.target.value == 1 && !function() {
    alert('if 1');
  }()) || (e.target.value == 2 && !function() {
    alert('else if 2');
  }()) || (e.target.value == 3 && !function() {
    alert('else if 3');
  }()) || (function() {
    alert('else');
  }());

});
<input type="text" id="myinput" />

Это заставляет меня хотеть попробовать определить эзотерический язык, в котором блоки неявно ведут себя как самовыполняющиеся анонимные функции и возвращают true, чтобы вы могли написать его так:

(condition && {
  action
}) || (condition && {
  action
}) || {
  action
}
0 голосов
/ 15 августа 2012

В ответ на вопрос, как и было предложено последним респондентом, вам понадобятся некоторые операторы if для определения состояния на фабрике. В этот момент вы создаете набор взаимодействующих классов, которые решают специфическую для государства проблему. Конечно, при необходимости потребуются другие условия, но они будут сведены к минимуму.

То, что было бы удалено, конечно, было бы бесконечной процедурной проверкой состояния, распространенной в таком большом количестве сервисного кода.

Упоминается интересная разговорная речь, так как это язык, который я использовал, прежде чем перетаскивать его на Java. Я не возвращаюсь домой раньше, чем раньше.

0 голосов
/ 21 декабря 2009

Ну, если вы пишете на Perl, это просто!

Вместо

if (x) {
    # ...
}

вы можете использовать

unless (!x){
    # ... 
}

; -)

0 голосов
/ 21 декабря 2009

Идея полиморфизма состоит в том, чтобы вызывать объект без предварительной проверки класса этого объекта.
Это не означает, что оператор if не должен использоваться вообще; вам следует избегать писать

if (object.isArray()) {
  // Code to execute when the object is an array.
} else if (object.inString()) {
  // Code to execute if the object is a string.
}
0 голосов
/ 21 декабря 2009

Это зависит от языка.

Языки со статической типизацией должны иметь возможность обрабатывать все проверки типов, разделяя общие интерфейсы и перегружая функции / методы.

В динамически типизированных языках может возникнуть необходимость по-разному подходить к проблеме, так как тип не проверяется при передаче сообщения, а только при обращении к объекту (более или менее). Использование общих интерфейсов по-прежнему является хорошей практикой и может исключить многие из операторов проверки типа.

Хотя некоторые конструкции обычно являются признаком запаха кода, я не решаюсь устранить любой подход к проблеме априори. Могут быть случаи, когда проверка типа с помощью if является целесообразным решением.

Примечание: другие предложили вместо этого использовать switch, но это просто умный способ написания более разборчивых операторов if.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...