Как проверить второй аргумент между действительностью true и false в haskell? Например, False && True
проверяет только первый аргумент и останавливает операцию. Есть что-то вроде False & True
в Haskell, чтобы проверить оба аргумента?Оператор & в haskell?
ответ
&&
в прелюдии реализуются как
(&&) :: Bool -> Bool -> Bool
True && x = x
False && _ = False
Это означает, в том случае, когда первый аргумент является False
второго один никогда не оценивал. Вы всегда можете реализовать свою собственную версию, чтобы иметь поведение, которое вы хотите например .:
(.&&.) :: Bool -> Bool -> Bool
True .&&. x = x
False .&&. False = False
False .&&. True = False
В котором второй второй аргумент оценивается в любом случае.
Не был бы умным компилятором, что второй аргумент может быть только «True» или «False» и, таким образом, оптимизировать его? –
@WillemVanOnsem Нет, потому что второй аргумент также может быть «undefined». Это определение подразумевает семантику 'False. &&. undefined = undefined', тогда как оригинал подразумевает 'False && undefined = False'. Компилятор не может изменить это. – luqui
Там нет никаких причин, почему вы хотите, но если вы настаиваете ...
import Control.Parallel (pseq)
(&&!) :: Bool -> Bool -> Bool
a &&! b = b `pseq` (a&&b)
Обычно seq
(который не требует каких-либо импорта) также будет достаточно, вместо pseq
, но только последний фактически гарантирует, что будет оценен b
.
Конечно, семантика этой функции будет точно такой же, как и &&
, в некоторых случаях она будет медленнее.
Не требует ли «seq' принудительной оценки? Я думал, что разница заключается в том, что команда «seq» заставляет вычислять перед возвратом, а «pseq» заставляет оценивать перед оценкой второго слагаемого. – PyRulez
Возможно, вы правы. Я обычно думаю о '' b'seq'a'' как о гарантии того, что среда выполнения не оставляет 'b' в качестве не-WHNF-хлама, без какого-либо надежного влияния на то, что он _does_ покидает ... но если' b' можно полностью оптимизировать, это, вероятно, также гарантирует, что это WHNF'd до того, как будет дан результат. – leftaroundabout
Технически 'b \' seq \ 'a' просто означает, что' b \ 'seq \' a' будет бесконечным циклом, если 'b'. Возможна одна оптимизация: 'b \' seq \ 'a = a \' seq \ '(b \' seq \ 'a)', поскольку это все еще удовлетворяет этому свойству. – PyRulez
- 1. Оператор равенства деревьев в Haskell
- 2. Как создать оператор в Haskell?
- 3. Что означает оператор/= в Haskell?
- 4. Где определяется оператор Haskell (. :)?
- 5. Оператор Haskell dot: какая разница?
- 6. Haskell: Подавать каррированный оператор доллара
- 7. Haskell Приоритет: Лямбда и оператор
- 8. Оператор Haskell для проверки ошибок
- 9. Оператор разницы в списке Haskell в F #
- 10. Неизвестный оператор haskell; `<>`
- 11. $ оператор в Haskell дает ошибку конструктора данных
- 12. Как определить постфиксный оператор в Haskell?
- 13. Haskell dot (.) Оператор в реализации закона Моргана
- 14. Haskell карта функция, где оператор в F #
- 15. >> оператор - бедный человек в Haskell?
- 16. Что делает оператор infix в Haskell?
- 17. Что такое: <оператор в Haskell?
- 18. Попытка понять оператор приложения функции в Haskell
- 19. В Haskell есть оператор с фиксированной точкой?
- 20. Цепь макс с. оператор в Haskell
- 21. Обратный оператор >> в haskell
- 22. Проблемы с Parsec Haskell <|> Оператор
- 23. Оператор Haskell $: почему это не работает?
- 24. ошибка синтаксиса Haskell для того, где оператор
- 25. Где я могу прочитать оператор haskell «->»?
- 26. Haskell создать новый оператор, и ошибки управления
- 27. Есть ли какой-то оператор Ord в списках в haskell?
- 28. Haskell: Последний оператор в конструкторе 'do' должен быть выражением
- 29. Кто-нибудь пытался реализовать Haskell-подобный оператор-заявление в C++?
- 30. Haskell: Пусть оператор с предыдущей объявленной переменной в объявлении функции
Почему вы хотите это сделать? –
Мы говорим об общем Haskell, или GHC? Для этого вы можете использовать [bang patterns] (https://downloads.haskell.org/~ghc/7.8.4/docs/html/users_guide/bang-patterns.html). –
Мне нужно это, потому что я использую отчет и в функции второй аргумент никогда не используется из-за этого. –