Проверка нескольких условий в случае - PullRequest
0 голосов
/ 05 февраля 2019

Предположим, у меня есть это (вставка в BST):

mybstInsert k inp@(INode left key right)
    | k < key = myNode (mybstInsert k left) key right
    | k > key = myNode left key (mybstInsert k right)

Что я хочу, так это то, что во втором условии я хочу еще одну проверку (проверка, является ли право пустым или нет).Поэтому я хочу разбить второе условие на два условия:

| k > key && isEmpty right == True = myNode left key (mybstInsert k right)
| k > key && isEmpty right == False = myNode left key (mybstInsert k right)

Предполагая, что у меня есть функция isEmpty, которая берет поддерево и сообщает мне, пусто оно или нет.

Что быбыть рекомендуемым способом сделать это?Это правильный синтаксис?(Я работаю на компьютере, на котором не установлен GHCi, поэтому не могу проверить синтаксис.

1 Ответ

0 голосов
/ 05 февраля 2019

Это правильный синтаксис, но вы также можете немного его упростить.

Во-первых, обратите внимание, что выражение x == True эквивалентно просто x.Таким образом, вы можете сбросить == True.

Во-вторых, часть == False совсем не нужна.Это потому, что к тому времени, когда вы приступаете к проверке этого случая, уже известно, что isEmpty right == False, потому что, если бы этого не произошло, вы бы остановились на предыдущем случае.

Итак, все этоможно написать так:

mybstInsert k inp@(INode left key right)
    | k < key = myNode (mybstInsert k left) key right
    | k > key && isEmpty right = myNode left key (mybstInsert k right)
    | k > key = myNode left key (mybstInsert k right)

Наконец, я хотел бы отметить, что вы не обрабатываете случай k == key, поэтому ваша программа будет аварийно завершать работу при таком вводе.Если вы хотите включить этот случай (и я предполагаю, что это будет просто запрет), вам не нужно включать даже проверку k > key, потому что к этому времени уже будет известно, что ни k == key ни k < key верно:

mybstInsert k inp@(INode left key right)
    | k == key = inp
    | k < key = myNode (mybstInsert k left) key right
    | isEmpty right = myNode left key (mybstInsert k right)
    | otherwise = myNode left key (mybstInsert k right)
...