2015-05-30 9 views
5

To jest pytanie o styl kodowania, a nie techniczne.Konflikt nazw między wartościami pól i zakresu lokalnego w Haskell

Często spotykałem się z problemem, w którym używam składni rekordów (mniejszej niż optymalnej) składni Haskell (lub soczewek, problem kończy się tak samo), aby utworzyć typ data. Kończę się funkcjami typu field accessor nazwanymi po moich polach. Będąc sumiennym programistą, staram się, aby moje nazwy rekordów były znaczące.

W pewnym momencie muszę pobrać pole z mojego typu i zachować jego wartość w zmiennej lokalnej. Często odbywa się to w ramach StateMonad w bloku do. Pytanie brzmi, jak nazwać zmienną lokalną. Najbardziej oczywista nazwa jest już używana jako akcesorium do obsługi pola. Używam skrótów, które powodują, że mój kod jest mniej czytelny.

Czy istnieje konwencja kodowania Haskella, która rozwiązuje ten problem?

Przykład

data Qaax = Qaax { 
     foo :: SomeFoo 
    , bar :: SomeBar 
    , ... 
    } 

baz :: (MonadState Qaax m) => (...) -> m() 
baz (...) = do 
    f <- gets foo -- I'd really like to use something more descriptive then 
       -- `f` but `foo` is already taken. 
    ... 
    return() 

Odpowiedz

3

Dodanie "jako przyrostka jest ustaloną konwencją dotyczącą tworzenia odrębnych, ale powiązanych nazw. Kluczowym przykładem jest foldl i foldl'.

W wyeksportowanych nazwach, takich jak foldl', zazwyczaj dobrym pomysłem jest wymyślenie spójnego motywu określającego, co "oznacza dla twojej biblioteki (często jest to" bardziej rygorystyczna wersja ", jak w foldl'). Ale w lokalnych nazwach możesz być dużo bardziej wolny, aby po prostu użyć "innej, ściśle powiązanej rzeczy, którą chciałbym mieć taką samą nazwę jak".

Wadą jest to, że nie jest to bardzo odrębny, więc może zaszkodzić czytelności; zwłaszcza, jeśli zazwyczaj powinieneś odnosić się do obu wersji. A kiedy potrzebujesz foo''' powinieneś pomyśleć o innym schemacie nazewnictwa!

2

Rozszerzenie NamedFieldPuns może w tym pomóc. Podczas dopasowywania wzoru na płycie, to wiąże zmienną o takiej samej nazwie, jak nazwa pola rekordu:

{-# LANGUAGE NamedFieldPuns #-} 

baz :: (MonadState Qaax m) => m() 
baz = do 
    Qaax {foo} <- get 
    return() 

Możliwym problemem jest to, że jest cień dostępowe do końca bloku do.

Powiązane problemy