module Ejemplo =
open System
open Microsoft.FSharp.Reflection
open System.Collections.Generic
type Diametro = Pequeño | Mediano | Grande
type Color = Narana | Amarilla | Verde
type Maduración = Pasada | Óptima | ``Ligeramente inmadura`` | ``Completamente inmadura``
type Forma = Redonda | ``Otra Forma``
type Peso = ``Menos 100g`` | ``Entre 100 y 200g`` | ``Entre 200 y 300g`` | ``Entre 300 y 400g`` | ``Entre 400 y 500g`` | ``Mayor 500g``
type Naranja = { Diametro: Diametro; Color: Color; Maduración: Maduración; Forma: Forma; Peso: Peso }
let Preguntar<'a>() =
let opciones = FSharpType.GetUnionCases(typeof<'a>)
let printOpcion
(o
: UnionCaseInfo
) = sprintf "%i - %s" o.
Tag o.
Name
let preguntar() =
printf "Selecciona %s: %s:\r\n" typeof
<'a>.Name (String.Join(", ", opciones |> Seq.map(printOpcion))) match Int32.TryParse(Console.ReadLine()) with
| (true, input) ->
match opciones |> Seq.tryFind(fun o -> o.Tag = input) with
| Some(case) -> Some(FSharpValue.MakeUnion(case,[||]) :?> 'a)
| None -> None
| (_, _) -> None
let mutable resultado = None
while resultado.IsNone do
resultado <- preguntar()
resultado.Value
let PreguntarPeso() =
printf "Introduce El peso para la selección anterior:\r\n" let mutable resultado = None
while resultado.IsNone do
resultado <-
match Int32.TryParse(Console.ReadLine()) with
| (true, input) -> Some(input)
| (_, _) -> None
resultado.Value
[<EntryPoint>]
let main argv =
let naranjas = Dictionary<_,int>()
let mutable continuar = true
while continuar do
let naranja = {
Diametro = Preguntar<Diametro>();
Color = Preguntar<Color>();
Maduración = Preguntar<Maduración>();
Forma = Preguntar<Forma>();
Peso = Preguntar<Peso>()}
let peso = PreguntarPeso()
if naranjas.ContainsKey(naranja) then
naranjas.[naranja] <- naranjas.[naranja] + peso
else
naranjas.Add(naranja, peso)
let mostrar (naranja, peso) =
"Diametro: %A Color: %A Maduración: %A Forma: %A Peso: %A Total: %i\r\n" naranja.Diametro naranja.Color naranja.Maduración naranja.Forma naranja.Peso peso
for n in naranjas do
mostrar(n.Key, n.Value)
continuar <- Console.ReadKey().Key = ConsoleKey.S
0