2013-12-15 7 views
1

Это довольно просто, но я не нашел удовлетворительного ответа нигде. Речь идет о строгом соответствии с нестрогим оператором, в данном случае простым OR.Нестрогий против строгого OR-оператора

ли я правильно понял, что со строгим оператором, вы всегда должны смотреть на второй из двух логических значений, например:

strict_or False True = True strict_or True False = True и так далее?

Как насчет оператора non_strict, делает это всегда Посмотрите только на первое значение или требуется 2 True значения для возврата True?

i.e. or True False = True vs. or True False = False?

Как это выглядит сейчас, есть еще какие-то логические ошибки в своем коде:

or' :: (Bool,Bool) -> Bool 
or' (True, True) = True 
or' (True, False) = False 
or' (False, _) = False 


strict_or :: (Bool, Bool) -> Bool 
strict_or (True,True) = True 
strict_or (False, True) = True 
strict_or (False, False) = False 
strict_or (True, False) = True 
+0

Если мне не хватает чего-то большого, 'or'', похоже, вообще не действует как OR, это имеет поведение И. В то время как стиль оценки отличается от строгого и нестрого ИЛИ, семантика таблицы истинности (при условии, что оба аргумента являются допустимыми булевыми) должны быть одинаковыми. –

+0

Да, это то, что я собрал, поэтому я сказал, что у меня есть некоторые ошибки в моей логике. – dschib

ответ

4

Независимо от того, есть ли у вас строгий или нестрогий or он всегда дает один и тот же ответ дал те же логические значения, так

True or True -> True 
False or True -> True 
True or False -> True 
False or False -> False 

Единственный случай, когда строгость имеет значение, заключается в том, что если у вас есть выражение A or B, где подвыражение B может: a) занять много времени (или даже навсегда!) Для вычисления или b) потенциально выбросить исключение.

Строгое or всегда будет работать потенциально длительный расчет, тогда как нестрогом or может «короткое замыкание», если первый параметр True и, следовательно, не оценивать второй параметр вообще. Это также означает, что если второе Подвыражение бросает исключение, когда он оценивается вы получите булеву таблицу, как это строгое or:

True or <exception> -> <exception> 
False or <exception> -> <exception> 

Но для нестрогого or вы будете иметь

True or <exception> -> True 
False or <exception> -> <exception> 

Обратите внимание, что все вышесказанное предполагает, что нестрогий or не является строгим по своему второму параметру (например, в Haskell и большинстве других языков программирования), но вы также можете иметь нестрогий or, строго для его первого параметра.

+0

Итак, при кодировании нестрого использует 'True _ = True', а strict всегда смотрит на оба значения? – dschib

+0

По существу, да. – shang

+0

Однако «Неверное истинное» на нестрочном должно также вернуть True, когда я все правильно понял? – dschib

1

Нестрогие функции только оценить операнды, если им нужно. Таким образом, нестрогий OR не будет оценивать второй операнд IF, если первый операнд окажется истинным. (Потому что результат будет справедливо независимо от того, что второй операнд является.)

+0

Итак, строгий оператор - это тот, кто ** требует ** двух истинных значений для возврата true? – dschib

+0

Нет, ни одна из версий 'or' не требует двух значений True. Это будет «и». – shang

+0

@dschib Реальное различие заключается в 'или True undefined', которое является« True »для ленивой версии и вызывает ошибку для строгой.Поведение для «нормальных» (не нижних) значений должно быть таким же, как и по определению дизъюнкции. – phg

 Смежные вопросы

  • Нет связанных вопросов^_^