Борьба с синтаксическим анализом операторов if и компоновки кода в Haskell - PullRequest
0 голосов
/ 23 сентября 2019

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

example x
    if x == 2 then "Input is 2"
        else if x > 2 then if x == 3 then "Input is 3"
                else "Input is greater than 3"
            else "Dunno"
        else "Dunno"

Мой предполагаемый ввод -> вывод:

-- input
[0, 1, 2, 3, 4] 
-- output
["Dunno", "Dunno", "Input is 2", "Input is 3", "Input is greater than 3"]

Мне трудно начать работу с Haskell. Я нахожу форматирование ifи еще гораздо менее интуитивно, чем Python.

Ответы [ 3 ]

5 голосов
/ 23 сентября 2019

Вы можете отформатировать его так же, как и в Python, с отступом на каждом уровне вложенности:

example x =
    if x == 2 then
        "Input is 2"
    else
        if x > 2 then
            if x == 3 then
                "Input is 3"
            else
                "Input is greater than 3"
        else
            "Dunno"
    else
        "Dunno"

В этот момент становится очевидным, что это не имеет никакого смысла, потому что их больше else s чем if s.

Но в любом случае вы обычно не вкладываете столько же if s в Haskell, поскольку существует сопоставление с образцом и охранники.

4 голосов
/ 23 сентября 2019

На самом деле вы были очень близки, вы только забыли знак равенства (=) в начале:

example x <b>=</b> if x == 2 then "Input is 2"
        else if x > 2 then if x == 3 then "Input is 3"
                else "Input is greater than 3"
            else "Dunno"

В Haskell редко используют if&hellip;then&hellip;else&hellip;.Обычно используются охранники или сопоставление с образцом.Вот более элегантный способ написать это с сочетанием сопоставления с образцом и защитных элементов:

example :: Int -> String
example 2 = "Input is 2"
example 3 = "Input is 3"
example x | x > 3 = "Input is greater than 3"
          | otherwise = "Dunno"

Я думаю, это проясняет, какая логика здесь выполняется.В основном, каждая строка закрывает регистр, с левой стороны от =, мы видим условие, с правой стороны, мы видим результат.

3 голосов
/ 23 сентября 2019

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

if condition
then result1
else result2

, что приведет к

example x =
    if x == 2
    then "Input is 2"
    else if x > 2
         then if x == 3
              then "Input is 3"
              else "Input is greater than 3"
         else "Dunno"

(Примечание: я удалил дополнительныеelse "Dunno" найдено в исходном коде, поскольку это ошибка)

В качестве альтернативы:

example x =
    if x == 2 then
       "Input is 2"
    else if x > 2 then
       if x == 3 then
          "Input is 3"
       else
          "Input is greater than 3"
    else
       "Dunno"

также хорошо, так как избегает "эффекта лестницы", когда отступ увеличивается.Это потому, что мы следуем схеме

if condition1 then
   result1
else if condition2 then
   result2
else if condition3 then
   result3
...
else
   resultN

Конечно, для этого конкретного примера я бы вместо этого использовал охранники и сопоставление с образцом.

example 2 = "Input is 2"
example 3 = "Input is 3"
example x
   | x > 2 = "Input is greater than 3"
   | otherwise = "Dunno"

(возможно, перенастраивая x > 2 вx > 3, что эквивалентно целым числам, но более читабельно здесь)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...