2015-03-25 3 views
3

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

(\a b -> if (b) then (not a) else a) 

, но я не мог придумать умный способ. Не могли бы вы помочь мне?

Спасибо.

+0

Почему вы хотите композицию? –

+0

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

+1

Hey @SumitMahamuni Я просто новичок, и мне любопытно узнать, есть ли умный способ написать его. – Rohit

ответ

3

Как указал другой пользователь, это пример xor, так как мы можем определить эту функцию?

Если входы равны, результат будет ложным. Если входы не равны, результат будет истинным.

\x y -> x /= y 

Редактировать: комментарий правильный, мой плохой! Определение, которое я дал ранее, не работает.

+1

'xor x x' не проверяет, что' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''' ' – rampion

+0

отредактировал мой ответ, спасибо за это! – zcleghern

12

Давайте посмотрим на таблицу истинности:

a b  f 
------------+------- 
False False | False 
False True | True 
True False | True 
True True | False 

Это интересно! f: True всякий раз, когда входы не совпадают. Hmm ......

+0

Это xor, но я не знаю, как его реализовать умно :( – Rohit

+0

О да, глупо от меня. Это должно быть просто «a! = B». Спасибо. – Rohit

+5

@Rohit, отлично! BTW, в Haskell это написано '/ ='. И вы можете написать '(\ ab -> a/= b)' как просто '(/ =)'; это обозначение, которое работает для всех инфиксных операторов. – luqui

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