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: floatEn 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 * heightEn 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" messageExemple 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 msgErrors 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" nextConclusió
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
