2015-12-20 1 views
-2

этот код, чтобы определить эксклюзивный стол дизъюнкция правда в HaskellКак определить эксклюзивные дизъюнкции с гвардейской Использование Haskell

Click here for more info on exclusive disjunction, XOR Код:

-- truth table concept of logical XOR 
exclusiveDisjunction :: Bool -> Bool -> Bool 
exclusiveDisjunction = x y 
    |True True <- False 
    |True False <- True 
    |False True <- True 
    |False False <- False 
    |otherwise = x y 

Результаты:

Ex6^.hs:31:5: 
     parse error on input ‘|’ 
    Failed, modules loaded: none. 

Как установить охранники с двумя булевыми значениями es задает таблицу истинности xor в синтаксисе haskell?

Спасибо Просьба указать ваш ответ, не используя haskell, встроенные в операторы, что означает не использовать & & ||.

Почему это не может быть сделано?

exclusiveDisjunction2 :: Bool -> Bool -> Bool 
exclusiveDisjunction2 x y 
    |True True = False 
    |True False = True 
    |False True = True 
    |False False = False 

это результат после запуска

Couldn't match expected type ‘Bool -> Bool’ with actual type ‘Bool’ 
    The function ‘False’ is applied to one argument, 
    but its type ‘Bool’ has none 
    In the expression: False False 
    In a stmt of a pattern guard for 
        an equation for ‘exclusiveDisjunction2’: 
     False False 
+0

Мне очень нравится, как диапазон ответов демонстрирует широкий диапазон, как многословный/точный код кода может быть написан в Haskell. Вы также можете увидеть эволюцию от подробного к краткому. – epsilonhalbe

ответ

3

Вы делаете ошибки синтаксиса. Если вы действительно хотите использовать охранник, вы можете сделать что-то вроде этого:

exclusiveDisjunction :: Bool -> Bool -> Bool 
exclusiveDisjunction x y 
    | x == True && y == True = False 
    | x == True && y == False = True 
    | x == False && y == True = True 
    | x == False && y == False = False 

Но это может быть более просто достигнуто case выражения:

exclusiveDisjunction :: Bool -> Bool -> Bool 
exclusiveDisjunction x y = case (x,y) of 
          (True, True) -> False 
          (True, False) -> True 
          (False, True) -> True 
          (False, False) -> False 

Или еще проще с помощью встроенного disjunction оператора:

exclusiveDisjunction :: Bool -> Bool -> Bool 
exclusiveDisjunction x y = case (x,y) of 
          (True, True) -> False 
          otherwise -> x || y 
+2

'x == True' эквивалентно' x', а 'x == False' эквивалентен' not x'. – gallais

+0

@ gallais Ах да, это было бы намного приятнее! – Sibi

+0

вы можете указать это без даже встроенных в Haskell операторов без && || ? пожалуйста, – abdulazizalmass

6

Как упоминалось @sibi, вы делаете ошибки синтаксиса. Но то, что вы делаете, достигается путем сопоставления шаблонов.

exclusiveDisjunction :: Bool -> Bool -> Bool 
exclusiveDisjunction True True = False 
exclusiveDisjunction True False = True 
exclusiveDisjunction False True = True 
exclusiveDisjunction False False = False 

Это может быть упрощено в

exclusiveDisjunction :: Bool -> Bool -> Bool 
exclusiveDisjunction True True = False 
exclusiveDisjunction True False = True 
exclusiveDisjunction _ a = a 
+0

ваши отвечают его, но мне нужно охранники, чтобы ответить на вопрос – abdulazizalmass

+0

Я пытался работать этот – abdulazizalmass

+0

«exclusiveDisjunction2 :: Bool -> Bool -> Bool exclusiveDisjunction2 ху | Правда True = False | True False = True | False True = True | False False = False ' – abdulazizalmass

6

Там уже есть хорошие ответы, но я хочу показать, как реализовать это в ясной форме, с моей точки зрения.

exclusiveDisjunction :: Bool -> Bool -> Bool 
exclusiveDisjunction True = not 
exclusiveDisjunction False = id 
+1

Clearer? В самом деле? Что насчет 'exclusiveDisjunction = foldr1 (.). флип падение [нет, нет]. fromEnum'? – user2407038

+0

@ user2407038 Это в значительной степени вопрос мнения, поэтому я сказал «с моей точки зрения». Вы можете не согласиться. – lisyarus

+0

не является логическим оператором? – abdulazizalmass

5

кратчайший.

exclusiveDisjunction :: Bool -> Bool -> Bool 
exclusiveDisjunction = (/=) 
+0

Спасибо за помощь и время – abdulazizalmass

+0

it делает вещь, но/= является встроенным логическим оператором haskell. – abdulazizalmass

+0

Я хочу, чтобы это было сделано без встроенных операторов – abdulazizalmass