LINUX.ORG.RU

История изменений

Исправление Begemoth, (текущая версия) :

Вообще в нормальных языках этот паттерн вообще не нужен, он нужен только в ублюдочных недоязычках без алгебраических типов данных и сопоставления с образцом. Так что в нормальных языках все пишется гораздо проще:

type Wheel = { name : string ; ... }
type Engine = { ... }
type Body = { ... }
type CarElement = CarWheel of Wheel
                | CarEngine of Engine
                | CarBody of Body

let printCarElement = function
    | Wheel { name = n } -> printfn "Wheel %s" n
    | Engine _ -> printfn "Engine"
    | Body _ -> printfn "Body"

Исходная версия Begemoth, :

Вообще в нормальных языках этот паттерн вообще не нужен, он нужен только в ублюдочных недоязычках без алгебраических типов данных и сопоставления с образцом. Так что в нормальных языках все пишется гораздо проще:

type Wheel = { name : string ; ... }
type Engine = { ... }
type Body = { ... }
type Car = { ... }
type CarElement = Wheel of Wheel
                | Engine of Engine
                | Body of Body
                | Car of Car

let printCarElement = function
    | Wheel { name = n } -> printfn "Wheel %s" n
    | Engine _ -> printfn "Engine"
    | Body _ -> printfn "Body"
    | Car _ -> printfn "Car"