Język programowania Haskell ma pojęcia newtypes
: Jeśli piszę newtype Foo = Foo (Bar)
, to nowy typ Foo
jest stworzony, że jest izomorficzna Bar
, to znaczy istnieją bijective konwersje między nimi. Właściwości tego konstruktu są następujące:języki Co programowania ma czegoś takiego Haskell za `newtype`
- Te dwa typy są całkowicie oddzielne (tzn. Kompilator nie zezwoli na użycie go tam, gdzie oczekuje się drugiego, bez użycia jawnych konwersji).
- Dzielą tę samą reprezentację. W szczególności funkcje konwersji mają koszt początkowy równy zero i zwracają "ten sam obiekt" na stercie.
- Konwersja jest możliwa tylko między takimi typami i nie można jej używać w niewłaściwy sposób, tj. Bezpieczeństwo typu jest zachowane.
Jakie inne języki programowania zapewniają tę funkcję?
Jeden przykład wydaje się być wartością jednej konstrukcji w C, gdy jest używany tylko z rekordzistami/konstruktorami. Nieprawidłowymi kandydatami będą jednowartościowe-struktury w C, gdy są używane z rzutami, ponieważ rzuty nie są sprawdzane przez kompilator lub obiekty z pojedynczym elementem w Javie, ponieważ nie będą miały tej samej reprezentacji.
Powiązane pytania: Does F# have 'newtype' of Haskell? (Nie) i Does D have 'newtype'? (już nie więcej).
Nie do końca rozumiem twoją argumentację, dlaczego jednowartościowe C-struktury nie kwalifikują się. Oczywiście, jeśli używasz rzutów, tracisz bezpieczeństwo typu, ale nie, jeśli używasz rekordzików i konstruktorów (tak jak robisz to również w Haskell).I każdy przyzwoity kompilator będzie wstawiał te do czegoś równoważnego rzutom, tak jak GHC robi to z 'newtype'. – leftaroundabout
leftroundabout: Masz rację; zmodyfikowałem moje pytanie. –
@leftaroundabout Twoje sformułowanie "każdy przyzwoity kompilator" prowadzi mnie do założenia, że kompilator języka C nie jest wymagany do tego? – Ingo