2012-03-02 24 views
7

Dla każdego pliku .hs można określić rozszerzenia języka polegać na tak:konwencję określania rozszerzeń w cabalized projektu

{-# LANGUAGE Foo, Bar, Baz #-} 

cabalized projekt może również określić rozszerzenia języka na zasadzie per-projektu plik .cabal:

extensions: Foo, Bar, Baz 

Który z nich uważany jest za "najlepszą praktykę"? Czy wszystkie używane rozszerzenia powinny być wymienione w pliku .cabal, jako forma dokumentowania kompilatorów, z którymi twój pakiet jest kompatybilny? A może wszystkie rozszerzenia powinny być zapisywane osobno dla każdego pliku, aby wyjaśnić, które pliki zależą od rozszerzeń? A co z obszernym dokumentowaniem w obu miejscach? A może najlepsza praktyka jest gdzieś pomiędzy?

Odpowiedz

7

To zależy od tego, jak bardzo są używane. Jeśli używasz rozszerzenia w każdym module w twoim projekcie, możesz umieścić go w swoim pliku cabal; na przykład, jeśli korzystasz z dyrektyw C preprocesora wszędzie, sensownie jest wstawić CPP w polu extensions zamiast wyświetlać je w kółko, a jeśli masz dużo skomplikowanych deklaracji instancji w swoich modułach, rozsądne może być umieszczenie FlexibleInstances również tam.

Ale "niebezpieczne" rozszerzenia (takie jak UndecidableInstances) i rozszerzenia używane tylko w kilku miejscach, powinny znajdować się w górnej części pliku: pierwsza dla dokumentacji (np. "Tutaj są smoki"), druga dla dokumentacji i aby efekty uboczne były izolowane, więc nie używasz przypadkowo efektów rozszerzenia, gdy nie masz zamiaru korzystać z innego modułu.

Ogólnie rzecz biorąc, pomyliłbym się po stronie umieszczenia ich na górze pliku, a używanie tylko pola extensions podczas określania rozszerzenia w kółko staje się denerwujące.

+0

Czy można wyciągnąć z tego wniosek, że sekcja "rozszerzenia" pliku .cabal zazwyczaj nie jest traktowana jako samodzielny manifest, z którego kompilatory mogą skompilować dany pakiet? –

+0

@DanBurton: Tak, nie interpretowałbym tego w ten sposób; nie byłoby to użytecznym wskaźnikiem dla programu przetwarzającego plik Cabal, ponieważ nic nie powstrzyma cię przed używaniem 'LANGUAGE' pragmas, a dla dokumentacji bardziej użyteczna jest lista takich rzeczy w dokumentacji niż umieszczanie ich w pliku Cabal, który jest w istocie częścią kodu. – ehird

0

OK, zarówno pytanie, jak i odpowiedź są bardzo stare. Wprowadziłem więc pewną aktualizację stanu rozszerzenia. Jeśli używasz nieszkodliwych rozszerzeń językowych (takich jak -XRecordWildCards, -XDeriveDataTypeable, -XTypeVariables) w wielu modułach lub irytujące jest umieszczenie pragma na poziomie {-# LANGUAGE ... #-} (ponieważ możesz nie wiedzieć o niektórych IDE lub narzędziach, które pozwolą ci umieścić pragmy językowe automatycznie) wtedy powinieneś użyć pola default-extensions:. Zauważcie, że jest też pole other-extensions:, które moim zdaniem jest bardzo mylące i nigdy nie powinno być używane. Zobacz examples here.