2016-12-02 56 views
5

Właśnie odkryłem, że taDlaczego jest to błąd składniowy w przypadku trafień kresowych bez dodatkowego wcięcia i jaki jest styl zalecany do obejścia tego?

foo = case ((),()) of 
     (() 
     ,()) ->() 

nie z

/tmp/wtmpf-file11080.hs:3:8: 
    parse error (possibly incorrect indentation or mismatched brackets) 

To może być wykonane do pracy wcięć drugą linię wzoru

foo = case ((),()) of 
     (() 
     ,()) ->() 

ale czuje niezgodne z moim zwykły styl, zwłaszcza w przypadku

bar = case (some lengthy :: Complicated typed expression 
      , another also lengthy :: Expression with (Other types)) of 
     (Complicated (Pattern match) to (unwrap) 
     , Expression that's (Again not so short)) -> the Rest of my Code 

W jaki sposób powyższe powinny być przepisane/sformatowane, aby wyglądały najbardziej spójnie?

+0

Jeśli chcesz tylko zminimalizować szum liniowy ze złożonego wzoru, możesz go zawinąć we wzór synonimu lub umieścić wyrażenie "case" w funkcji wyższego rzędu a la 'maybe' /' either'/'foldr ' –

Odpowiedz

7

Przez indentation rules kod

foo = case ((),()) of 
     (() 
     ,()) ->() 

jest odcukrzona do

foo = case ((),()) of 
     { (() 
     ; ,()) ->() 
     } 

który jest case z dwóch oddziałów, z których pierwszy jest błąd składni.

Polecam następujący styl zamiast:

foo = case ((),()) of 
     ((() 
     ,())) ->() 

lub nawet (nie bardzo elegancki, chociaż)

foo = case ((),()) of 
     [email protected](() 
     ,()) ->() 
1

Można też po prostu przepisać mecz wzór jak

(Complicated (Pattern match) to (unwrap), 
    Expression that's (Again not so short)) -> the Rest of my Code 

Wiem, że jest to niezgodne z twoim stylem, ale myślę, że nie ma prawdziwego powodu, aby używać tego stylu do tupu les (poza konsystencją).