Patrząc na poniższy kod:Czy często używa się tej samej nazwy dla typu danych i konstruktora wartości w Haskell?
data Point = Point Float Float deriving (Show)
data Shape = Circle Point Float | Rectangle Point Point deriving (Show)
który jest z książki Dowiedz ci Haskell za wielkie dobro, które towarzyszy tej przykład kodu z następującym tekstem:
Zauważ, że przy określaniu punktu użyliśmy tej samej nazwy dla typu danych i konstruktora wartości. Nie ma to specjalnego znaczenia, chociaż często używa się tej samej nazwy co typ, jeśli istnieje tylko jeden konstruktor wartości.
Teraz moje założenie, że data Point = ...
jest typem danych, a ... = Point Float...
jest konstruktor wartość.
Moje pytanie brzmi: Czy często używa się tej samej nazwy dla typu danych i konstruktora wartości w Haskell?
Tak, jest. Jednak zazwyczaj używamy 'newtype' zamiast' data'. Na przykład "Stan" jest zwykle definiowany w następujący sposób: 'stan nowego stanu s a = Stan {runState :: s -> (a, s)}'. –
@AaditMShah Działa to tylko dla pojedynczych konstruktorów pól. Chyba że za każdym razem chcesz rozpakować krotkę, nie możesz użyć 'newtype' dla wspomnianego' Point'. – Zeta
Kiedyś wyjaśniałem Haskell komuś, że w niektórych językach (np. Java) konstruktor * zawsze * ma taką samą nazwę jak typ. Tak więc dla kogoś, kto przyjeżdża do Haskell, może być mylące mieć różne nazwy konstruktorów. – user2297560