2016-04-27 3 views
2

Как проверить второй аргумент между действительностью true и false в haskell? Например, False && True проверяет только первый аргумент и останавливает операцию. Есть что-то вроде False & True в Haskell, чтобы проверить оба аргумента?Оператор & в haskell?

+2

Почему вы хотите это сделать? –

+1

Мы говорим об общем Haskell, или GHC? Для этого вы можете использовать [bang patterns] (https://downloads.haskell.org/~ghc/7.8.4/docs/html/users_guide/bang-patterns.html). –

+0

Мне нужно это, потому что я использую отчет и в функции второй аргумент никогда не используется из-за этого. –

ответ

6

&& в прелюдии реализуются как

(&&) :: Bool -> Bool -> Bool 
True && x = x 
False && _ = False 

Это означает, в том случае, когда первый аргумент является False второго один никогда не оценивал. Вы всегда можете реализовать свою собственную версию, чтобы иметь поведение, которое вы хотите например .:

(.&&.) :: Bool -> Bool -> Bool 
True .&&. x = x 
False .&&. False = False  
False .&&. True = False 

В котором второй второй аргумент оценивается в любом случае.

+3

Не был бы умным компилятором, что второй аргумент может быть только «True» или «False» и, таким образом, оптимизировать его? –

+10

@WillemVanOnsem Нет, потому что второй аргумент также может быть «undefined». Это определение подразумевает семантику 'False. &&. undefined = undefined', тогда как оригинал подразумевает 'False && undefined = False'. Компилятор не может изменить это. – luqui

4

Там нет никаких причин, почему вы хотите, но если вы настаиваете ...

import Control.Parallel (pseq) 

(&&!) :: Bool -> Bool -> Bool 
a &&! b = b `pseq` (a&&b) 

Обычно seq (который не требует каких-либо импорта) также будет достаточно, вместо pseq, но только последний фактически гарантирует, что будет оценен b.

Конечно, семантика этой функции будет точно такой же, как и &&, в некоторых случаях она будет медленнее.

+0

Не требует ли «seq' принудительной оценки? Я думал, что разница заключается в том, что команда «seq» заставляет вычислять перед возвратом, а «pseq» заставляет оценивать перед оценкой второго слагаемого. – PyRulez

+0

Возможно, вы правы. Я обычно думаю о '' b'seq'a'' как о гарантии того, что среда выполнения не оставляет 'b' в качестве не-WHNF-хлама, без какого-либо надежного влияния на то, что он _does_ покидает ... но если' b' можно полностью оптимизировать, это, вероятно, также гарантирует, что это WHNF'd до того, как будет дан результат. – leftaroundabout

+0

Технически 'b \' seq \ 'a' просто означает, что' b \ 'seq \' a' будет бесконечным циклом, если 'b'. Возможна одна оптимизация: 'b \' seq \ 'a = a \' seq \ '(b \' seq \ 'a)', поскольку это все еще удовлетворяет этому свойству. – PyRulez

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