Haskell: где ошибка синтаксического анализа в шаблоне

Это код, который у меня есть:

connected :: [(Integer,Integer)] -> Bool
connected [] = True
connected [(_,_)] = True
connected (a,b):(c,d):xs
                 | a > c     = False
                 |otherwise = connected (c,d):xs

Когда я загружаю его GHCi, он показывает

error: parse error in pattern: connected

Где я сделал ошибку?


person Jack    schedule 06.09.2017    source источник
comment
Незначительное примечание к стилю: foo | x = False | otherwise = something (IMO) чаще пишется как foo = not x && something. В вашем случае вы можете использовать connected (...) = a <= c && connected (...).   -  person chi    schedule 06.09.2017


Ответы (1)


Вам нужно добавить круглые скобки вокруг ваших минус-выражений в двух местах:

connected :: [(Integer,Integer)] -> Bool
connected [] = True
connected [(_,_)] = True
connected ((a,b):(c,d):xs)                           -- (2)
                 | a > c     = False
                 | otherwise = connected ((c,d):xs)  -- (1)
  1. Приложение-функция связывается более тесно, чем инфиксные операторы, поэтому connected (c,d) : xs анализируется как (connected (c,d)) : xs.

  2. То же самое происходит и в выражении шаблона. Хотя бесполезное сообщение об ошибке, которое вы там получаете, довольно прискорбно.

Мнение: я рекомендую всегда писать инфиксные операторы с пробелами вокруг них (например, a : b вместо a:b), потому что я думаю, что пропуск пробела тонко подразумевает, что оператор связывает более тесно, чем на самом деле.

person Chris Martin    schedule 06.09.2017