Скобки в Haskell: где и почему они запрещены на LHS - PullRequest
4 голосов
/ 27 марта 2020

Я использую скобки в Haskell, которые в основном необязательны: они необходимы для переопределения обычной привязки / приоритета; в противном случае свободно добавляйте / опускайте их, чтобы улучшить читаемость. Затем рассмотрите их (в GH C 8.6.5.):

f (Just x) = x         -- needed around `(Just x)` because `f Just x` would bind differently

(Just y)   = Just ()   -- pattern based binding for var `y`
Just y2    = Just ()   -- but optional around `(Just y)`
Just (y3)  = Just ()   -- optional around bare variables
x          = ()
(x2)       = ()

Не пытаясь это сделать сначала, ожидаете ли вы, что парнины будут необязательными для LHS функционального уравнения здесь:

(f (Just x)) = x

Это отклонено: Parse error in pattern: f. «в шаблоне» предполагает, что синтаксический анализатор ожидает ( для запуска шаблона, тогда почему шаблон Just y2 = ... не отклонен из-за отсутствия паренов?

С

* происходит что-то непоследовательное / немного страннее 1013 *

Существует ли какой-либо шаблон логики / логики для парней с этими примерами?

Я спрашиваю, потому что я всегда пишу шаблоны в паренах (Just y) = ...; Я был удивлен, что парены являются необязательными, потому что Just y2 = ... может легко быть опечаткой для функции decl just y2 = ....

Addit: Ах да, паренсы требуются вокруг префикса, используемого оператором. Эти работы:

pattern (::~~) x y = (x, y)        -- OK
pattern x ::~ y    = (x, y)        -- OK

(::~~) True y4     = (True, ())    -- OK
(True ::~~  y5)    = (True, ())    -- OK
True ::~~  y6      = (True, ())    -- OK

Это не

-- pattern (x ::~~ y) = (x, y)  -- parse error on input `x'
...