Les unions discriminades són una característica poderosa de F# que permet definir tipus que poden tenir diverses formes. Aquestes formes es defineixen com a constructors de tipus, i cada constructor pot tenir els seus propis valors associats. Les unions discriminades són molt útils per representar dades que poden tenir diferents variants, com ara resultats d'operacions que poden ser èxits o errors, o formes geomètriques que poden ser cercles, quadrats, etc.
Conceptes Clau
- Definició d'Unions Discriminades: Com es defineixen i utilitzen les unions discriminades.
- Coincidència de Patrons: Com utilitzar la coincidència de patrons per treballar amb unions discriminades.
- Exemples Pràctics: Exemples d'ús d'unions discriminades en diferents contextos.
- Errors Comuns: Errors comuns en l'ús d'unions discriminades i com evitar-los.
Definició d'Unions Discriminades
Per definir una unió discriminada en F#, utilitzem la paraula clau type
seguida del nom del tipus i els constructors de tipus. Aquí teniu un exemple bàsic:
type Shape = | Circle of radius: float | Rectangle of width: float * height: float | Triangle of base: float * height: float
En aquest exemple, Shape
és una unió discriminada amb tres constructors: Circle
, Rectangle
i Triangle
. Cada constructor té els seus propis valors associats.
Coincidència de Patrons
La coincidència de patrons és una tècnica poderosa per treballar amb unions discriminades. Permet descompondre i processar els valors de les unions discriminades de manera clara i concisa. Aquí teniu un exemple de com utilitzar la coincidència de patrons amb la unió discriminada Shape
:
let area shape = match shape with | Circle radius -> Math.PI * radius * radius | Rectangle (width, height) -> width * height | Triangle (base, height) -> 0.5 * base * height
En aquest exemple, la funció area
calcula l'àrea d'una forma donada. Utilitza la coincidència de patrons per descompondre el valor de shape
i aplicar la fórmula adequada per a cada tipus de forma.
Exemples Pràctics
Exemple 1: Resultat d'Operació
Les unions discriminades són útils per representar resultats d'operacions que poden ser èxits o errors. Aquí teniu un exemple:
type Result<'T> = | Success of value: 'T | Error of message: string let divide x y = if y = 0.0 then Error "Cannot divide by zero" else Success (x / y) let result = divide 10.0 2.0 match result with | Success value -> printfn "Result: %f" value | Error message -> printfn "Error: %s" message
Exemple 2: Representació de Missatges
Les unions discriminades també es poden utilitzar per representar diferents tipus de missatges en un sistema de missatgeria:
type Message = | Text of content: string | Image of url: string | Video of url: string * duration: int let processMessage message = match message with | Text content -> printfn "Text message: %s" content | Image url -> printfn "Image message: %s" url | Video (url, duration) -> printfn "Video message: %s, duration: %d seconds" url duration let msg = Video ("http://example.com/video", 120) processMessage msg
Errors Comuns
- No Cobrir Tots els Constructors: Quan utilitzeu la coincidència de patrons, assegureu-vos de cobrir tots els constructors de la unió discriminada. Si no ho feu, el compilador generarà un advertiment.
- No Utilitzar Valors Associats: Quan definiu constructors amb valors associats, assegureu-vos d'utilitzar aquests valors en la coincidència de patrons.
Exercicis Pràctics
Exercici 1: Definir una Unió Discriminada
Defineix una unió discriminada TrafficLight
que representi els tres estats d'un semàfor: Red
, Yellow
i Green
.
Exercici 2: Coincidència de Patrons amb TrafficLight
Escriu una funció nextLight
que prengui un valor de TrafficLight
i retorni el següent estat del semàfor.
Solucions
Solució 1
Solució 2
let nextLight light = match light with | Red -> Green | Yellow -> Red | Green -> Yellow let currentLight = Red let next = nextLight currentLight printfn "Next light: %A" next
Conclusió
Les unions discriminades són una característica fonamental de F# que permeten definir tipus amb múltiples formes. La coincidència de patrons facilita el treball amb aquests tipus de manera clara i concisa. Amb la pràctica, les unions discriminades es convertiran en una eina poderosa en el vostre arsenal de programació en F#.
Curs de Programació en F#
Mòdul 1: Introducció a F#
Mòdul 2: Conceptes Bàsics
- Tipus de Dades i Variables
- Funcions i Immutabilitat
- Coincidència de Patrons
- Col·leccions: Llistes, Matrius i Seqüències
Mòdul 3: Programació Funcional
Mòdul 4: Estructures de Dades Avançades
Mòdul 5: Programació Orientada a Objectes en F#
- Classes i Objectes
- Herència i Interfícies
- Barreja de Programació Funcional i Orientada a Objectes
- Mòduls i Espais de Noms
Mòdul 6: Programació Asíncrona i Paral·lela
- Fluxos de Treball Asíncrons
- Biblioteca de Tasques Paral·leles
- MailboxProcessor i Agents
- Patrons de Concurrència
Mòdul 7: Accés i Manipulació de Dades
Mòdul 8: Proves i Depuració
- Proves Unitàries amb NUnit
- Proves Basades en Propietats amb FsCheck
- Tècniques de Depuració
- Perfilat de Rendiment