Haskell - Двойное охранное выражение = "ошибка синтаксического анализа на входе` | '"? - PullRequest
0 голосов
/ 17 июня 2020

В настоящее время я работаю над некоторыми алгоритмами для двоичных деревьев. Однако я столкнулся с проблемой, которую не могу решить. Я всегда получаю следующую ошибку:

ошибка: ошибка синтаксического анализа при вводе '|'

Хотя я понимаю, что это связано с интервалом, я думаю, что должен был сделать это правильно.

delTree a Leaf = error "No tree here!"
delTree a (Branch left w right)
          | a < w = delTree a left
          | a > w = delTree a right
          | a == w 
                      | ...

Я что-то упустил? Связано ли это с использованием выражения защиты дважды?

Изменить: это моя структура данных

data BinTree a = Leaf | Branch (BinTree a) a (BinTree a) deriving Show

С помощью delTree я пытаюсь удалить узел в двоичном дереве. Единственный способ, который я вижу, - это, конечно, поиск правильного значения и затем замена его левым или правым дочерним элементом (в зависимости от того, есть ли левый дочерний элемент). Если есть другой способ, то я открыт для совета!

Ответы [ 2 ]

2 голосов
/ 17 июня 2020

Вы можете рассмотреть возможность использования расширения MultiWayIf. К сожалению, есть сдвиг в синтаксисе с = на ->, что немного раздражает:

{-# LANGUAGE MultiWayIf #-}

delTree a Leaf = error "No tree here!"
delTree a (Branch left w right)
          | a < w = delTree a left
          | a > w = delTree a right
          | a == w
            = if | False -> error "whatever"
                 | True  -> error "something else"

, но вы можете переключить внешние защитные ограждения на многостороннее «если» для единообразия:

delTree a Leaf = error "No tree here!"
delTree a (Branch left w right)
  = if | a < w  -> delTree a left
       | a > w  -> delTree a right
       | a == w -> if | False -> error "whatever"
                      | True  -> error "something else"

В качестве альтернативы, подумайте о помощнике where, прежде чем становиться слишком необычным:

delTree a Leaf = error "No tree here!"
delTree a (Branch left w right)
          | a < w = delTree a left
          | a > w = delTree a right
          | a == w = found
  where found | False = error "whatever"
              | True  = error "something else"
1 голос
/ 17 июня 2020

Небольшое повторение - не всегда плохо.

delTree a (Branch left w right)
          | a < w = delTree a left
          | a > w = delTree a right
delTree a (Branch left w right) | ...
                                | ...

Если ни a < w, ни a > w не истинны, вы можете предположить, что a == w должно быть истинным, и его можно оставить подразумевается во втором определении. Вы можете даже go использовать три определения, некоторые только с одной защитой.

delTree a (Branch left w _) | a < w = delTree a left
delTree a (Branch _ w right) | a > w = delTree a right
delTree a (Branch left w right) | ...

Вы также можете рассмотреть возможность использования compare вместо операторов сравнения.

delTree a (Branch left w right) = case compare a w of
                                     LT -> delTree a left
                                     GT -> delTree a right
                                     EQ -> ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...