Выполнить несколько операторов на основе логических условий в Haskell - PullRequest
0 голосов
/ 03 марта 2019

Я новичок в Haskell. Я пытаюсь выполнить несколько операторов, если несколько логических значений имеют значение true.Я попробовал это с помощью охраны, но он выполняет только первое утверждение, которое верно, и он останавливается.Я хочу, чтобы он выполнил все из них, которые являются истинными, например, f 5, выполнив gx, а затем также выполнив h x.Я попробовал это, используя операторы if, но не смог.

f x

  | x < 10 = g x

  | x < 15 = h x

  | otherwise = m x

Это просто упрощение, у меня на самом деле другая программа.Случаи разные, я просто пытаюсь иметь несколько операторов if, как в других языках программирования.Так что в этом примере, если x <10, то сделайте что-то, ТАКЖЕ, если x <15, сделайте это. </p>

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

"например, f 5 выполнить gx, а затем также выполнить hx"

И что возвращать?Мы должны вернуть некоторое значение , вот как работает электронная стоимость в Haskell.

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

f x = [ g x | x < 10 ] ++ [ h x | x < 15 ] ++ [ m x | True ]

Этот список будет содержать все результаты, для которых выражение справа от их | (список защиты списка) оценивается как True.++ добавляет два списка в один.True тривиально оценивается как True, поэтому может быть опущено: [ m x ].

0 голосов
/ 03 марта 2019

В чисто функциональном программировании мы не выполняем операторы, как в императивном программировании.нет понятия «сделай это, тогда сделай это».Вместо этого мы в основном пишем функции, которые принимают несколько аргументов в качестве входных данных и возвращают некоторые выходные данные.

Что если мы хотим взаимодействовать с миром, а не просто вычислять возвращаемое значение?Ну, в данном конкретном случае мы прибегаем к монаде IO.Обратите внимание, что это не то, что мы делаем часто - мы предпочитаем избегать монады ввода-вывода, насколько это возможно, чтобы сохранить большую часть вычислений в чистоте.

Вот пример:

f :: Int -> IO ()
f x = do
   putStrLn "hello"
   if x > 15
   then putStrLn "> 15"
   else putStrLn "not > 15"
   if x > 10
   then putStrLn "> 10"
   else putStrLn "not > 10"

Если вы новичок, я бы порекомендовал вам изучить основы Haskell перед использованием монады IO.Повсеместное использование монады ввода-вывода привело бы к очень однотипному коду.

Большинство императивных программистов, изучающих FP, стараются перенести свои прежние привычки на языки FP - это очень распространено.Однако программирование с побочными эффектами и изменяемыми переменными плохо справляется с FP.Постепенно нужно перестать думать в терминах эффективных утверждений и вместо этого перемонтировать свой мозг, чтобы мыслить в терминах ценностей и (часто рекурсивных) определений.

Обратите внимание, что FP не является особенным в этом аспекте.Если бы кто-то сначала выучил чистый FP, скажем, на Haskell, а затем подошел к какому-либо императивному языку программирования, они, вероятно, спросили бы: «Как мне использовать монаду состояний?».Даже если бы вы могли использовать монаду состояния в -say-Java, это было бы глупо, поскольку использование изменяемых переменных было бы гораздо более естественным.Опять же, программирование пытается внедрить свои предыдущие методы в новый язык / парадигму, игнорируя новые возможности и создавая недиоматический код.

...