this post was submitted on 07 Aug 2023
10 points (100.0% liked)
Spørgsmål og Svar
294 readers
3 users here now
Her kan du spørge andre brugere om lige hvad du vil. Intet spørgsmål er for småt og der findes ingen dumme spørgsmål.
Regler
- Indlæg skal være reelle spørgsmål som er spurgt i god tro. Indlæg må ikke være brok skjult som et spørgsmål og spørgsmål må ligeledes ikke være ladede.
founded 2 years ago
MODERATORS
you are viewing a single comment's thread
view the rest of the comments
view the rest of the comments
Hmm, det har du måske ret i. Jeg finder deres implicitte interfaces meget interessante. Men du har nok ret i at det ikke havde fungeret hvis google ikke havde opreklameret det sådan.
Må hellere se på Rust så. Har også overvejet at lære Zig, men det er vidst lidt niche
Synes selv det er en meget mærkelig feature. Især fordi man potentielt kan implementere et interface ved en fejl. Jeg er generelt imod implicitte ting.
Mener du traits? Jeg har ikke selv brugt Rust, men har kodet en del Haskell, og så vidt jeg kan forstå er traits nogenlunde samme koncept som type classes i Haskell. Jeg synes selv at det er en langt overlegent måde at definere interfaces på sammenlignet med interfaces defineret ved subtypning som i de fleste objektorierentede sprog (Java, C#). OO-interfaces kan være OK til typer som repræsenterer objekter (services og ressourcer med en livscyklus som f.eks. en web service eller en netværksport), men til typer som repræsenterer data (lister, maps, vektorer, etc.) der er type classes den rigtige abstraktion, og OO-interfaces fører kun til hovedpiner.
I Haskell er der som udgangspunkt også en begrænsning der tvinger dig til at definere dine type classes samme sted som datatypen hvilket begrænser risikoen for at komme til at definere en instans "ved en fejl".
Nej altså implicitte interfaces er en feature i Go, ikke i Rust.
Og ja, Rust traits er dybest set det samme som Haskell type classes. Der er dog visse ting du kan i Haskell som du ikke kan i Rust (noget avanceret higher order ting). Men det er meget sjældent et problem.
I Rust kan du implementere traits hvor du har lyst, men du skal have defineret enten traitet eller datatypen (eller begge dele) for at implementere det. Du kan ikke implementere et fremmed trait på en fremmed type. Kan ikke lige huske om Haskell har en lignende restriktion.
Ah, så læste jeg bare tråden forkert, beklager :).
Jo, det er samme restriktion i Haskell. Den kan slås fra hvis man virkelig har brug for det, f.eks. hvis et 3. parts bibliotek kræver at en anden 3. parts type er en instans af en given typeklasse, og man ikke har mulighed for at bruge en
newtype
.