Discriminated Unions
Contents
- Overview
- Basic Usage
- Union Cases
- Union Cases with Fields
- Named and Anonymous Fields
- Type Parameters
- Union Attributes
- Access Modifiers
- XML Documentation
- Union Members
- Struct Unions
- Using Unions Instead of Object Hierarchies
- Tree Data Structures with Recursive Unions
- Mutually Recursive Unions
- Unwrapping Union Cases
- Pattern Matching with Unions
Overview
Discriminated unions provide support for values that can be one of a number of named cases, possibly each with different values and types. They are useful for heterogeneous data, handling special cases (including valid and error cases), data that varies in type, and as an alternative to small object hierarchies. Recursive discriminated unions can represent tree data structures.
Basic Usage
Create a discriminated union with the Union
widget:
#r "../../src/Fabulous.AST/bin/Release/netstandard2.1/publish/Fantomas.Core.dll"
#r "../../src/Fabulous.AST/bin/Release/netstandard2.1/publish/Fabulous.AST.dll"
#r "../../src/Fabulous.AST/bin/Release/netstandard2.1/publish/Fantomas.FCS.dll"
open Fabulous.AST
open type Fabulous.AST.Ast
Oak() {
AnonymousModule() {
Union("Color") {
UnionCase("Red")
UnionCase("Green")
UnionCase("Blue")
}
}
}
|> Gen.mkOak
|> Gen.run
|> printfn "%s"
// produces the following code:
|
Union Cases
Add cases to unions with the UnionCase
widget. The option
type is a simple discriminated union in the F# core library:
Oak() {
AnonymousModule() {
Union("Option") {
UnionCase("Some", "'a")
UnionCase("None")
}
|> _.typeParams(PostfixList("'a"))
}
}
|> Gen.mkOak
|> Gen.run
|> printfn "%s"
// produces the following code:
|
Union Cases with Fields
Add fields to union cases, as in this Shape type example from the F# documentation:
Oak() {
AnonymousModule() {
Union("Shape") {
UnionCase("Rectangle", [ Field("width", Float()); Field("length", Float()) ])
UnionCase("Circle", Field("radius", Float()))
UnionCase("Prism", [ Field("width", Float()); Field(Float()); Field("height", Float()) ])
}
}
}
|> Gen.mkOak
|> Gen.run
|> printfn "%s"
// produces the following code:
|
Named and Anonymous Fields can be named or anonymous. In the previous example, most fields are named, but the second field of the Prism case is anonymous.
You construct objects by providing values for the named and anonymous fields:
// Using the Shape type from above
let rect = Rectangle(length = 1.3, width = 10.0)
let circ = Circle(1.0)
let prism = Prism(5.0, 2.0, height = 3.0)
In the Fabulous.AST construction, you can define fields with or without names:
Oak() {
AnonymousModule() {
Union("Shape") {
// Named fields
UnionCase("Rectangle", [ Field("width", Float()); Field("length", Float()) ])
// Anonymous field
UnionCase("Circle", Float())
// Mixed named and anonymous fields
UnionCase("Prism", [ Field("width", Float()); Field(Float()); Field("height", Float()) ])
}
}
}
|> Gen.mkOak
|> Gen.run
|> printfn "%s"
// produces the following code:
|
Type Parameters
Add type parameters to unions with the typeParams
method, like in the option
type:
Oak() {
AnonymousModule() {
Union("Option") {
UnionCase("Some", "'a")
UnionCase("None")
}
|> _.typeParams(PostfixList("'a"))
}
}
|> Gen.mkOak
|> Gen.run
|> printfn "%s"
// produces the following code:
|
Union Attributes
Add attributes to unions with the attribute
or attributes
methods:
Oak() {
AnonymousModule() {
// Using the RequireQualifiedAccess attribute
Union("CommandType") {
UnionCase("Create")
UnionCase("Update")
UnionCase("Delete")
}
|> _.attribute(Attribute("RequireQualifiedAccess"))
// Using the Struct attribute for value type unions
Union("StructShape") {
UnionCase("Circle", Float())
UnionCase("Square", Float())
}
|> _.attribute(Attribute("Struct"))
}
}
|> Gen.mkOak
|> Gen.run
|> printfn "%s"
// produces the following code:
|
Access Modifiers
Set access modifiers for unions with the toPublic
, toPrivate
, and toInternal
methods.
By default, accessibility for discriminated unions is public.
Oak() {
AnonymousModule() {
Union("PublicUnion") {
UnionCase("Case1")
UnionCase("Case2")
}
|> _.toPublic()
Union("PrivateUnion") {
UnionCase("Case1")
UnionCase("Case2")
}
|> _.toPrivate()
}
}
|> Gen.mkOak
|> Gen.run
|> printfn "%s"
// produces the following code:
|
XML Documentation
Add XML documentation to unions with the xmlDocs
method:
Oak() {
AnonymousModule() {
Union("DocumentedUnion") {
UnionCase("Case1")
UnionCase("Case2")
}
|> _.xmlDocs([ "A discriminated union with documentation" ])
}
}
|> Gen.mkOak
|> Gen.run
|> printfn "%s"
// produces the following code:
|
Union Members
Add members to unions with the members
method. This example shows a Shape type with an Area property:
Oak() {
AnonymousModule() {
(Union("Shape") {
UnionCase("Circle", Field("radius", Float()))
UnionCase("EquilateralTriangle", Field("side", Float()))
UnionCase("Square", Field("side", Float()))
UnionCase("Rectangle", [ Field("length", Float()); Field("width", Float()) ])
})
.members() {
Member(
"this.Area",
MatchExpr(
"this",
[ MatchClauseExpr(
LongIdentPat("Circle", NamedPat("r")),
InfixAppExpr("Math.PI", "*", ParenExpr(InfixAppExpr("r", "*", "r")))
)
MatchClauseExpr(
LongIdentPat("EquilateralTriangle", [ NamedPat("s") ]),
InfixAppExpr(
InfixAppExpr("s", "*", "s"),
"*",
InfixAppExpr(AppExpr("sqrt", Float(3.0)), "/", Float(4.0))
)
)
MatchClauseExpr(LongIdentPat("Square", [ NamedPat("s") ]), InfixAppExpr("s", "*", "s"))
MatchClauseExpr(
LongIdentPat("Rectangle", ParenPat(TuplePat([ NamedPat("l"); NamedPat("w") ]))),
InfixAppExpr("l", "*", "w")
) ]
)
)
}
}
}
|> Gen.mkOak
|> Gen.run
|> printfn "%s"
// produces the following code:
|
Struct Unions
Create struct discriminated unions with the Struct
attribute:
Oak() {
AnonymousModule() {
Union("SingleCase") { UnionCase("Case", String()) }
|> _.attribute(Attribute("Struct"))
Union("Multicase") {
UnionCase("Case1", String())
UnionCase("Case2", Int())
UnionCase("Case3", "double")
}
|> _.attribute(Attribute("Struct"))
}
}
|> Gen.mkOak
|> Gen.run
|> printfn "%s"
// produces the following code:
|
Using Unions Instead of Object Hierarchies
Discriminated unions can be used as a simpler alternative to small object hierarchies. Here's an example from the F# documentation:
Oak() {
AnonymousModule() {
Union("Shape") {
UnionCase("Circle", Field("radius", Float()))
UnionCase("Square", Field("side", Float()))
UnionCase("Rectangle", [ Field("height", Float()); Field("width", Float()) ])
}
// Calculate area using pattern matching instead of virtual methods
Function(
"area",
ParameterPat("shape"),
MatchExpr(
"shape",
[ MatchClauseExpr(
LongIdentPat("Circle", [ NamedPat("r") ]),
InfixAppExpr("Math.PI", "*", ParenExpr(InfixAppExpr("r", "*", "r")))
)
MatchClauseExpr(LongIdentPat("Square", NamedPat("s")), InfixAppExpr("s", "*", "s"))
MatchClauseExpr(
LongIdentPat("Rectangle", ParenPat(TuplePat([ NamedPat("h"); NamedPat("w") ]))),
InfixAppExpr("h", "*", "w")
) ]
)
)
}
}
|> Gen.mkOak
|> Gen.run
|> printfn "%s"
// produces the following code:
|
Tree Data Structures with Recursive Unions
Use recursive discriminated unions to create tree data structures. Here's the Expression example from the F# documentation:
Oak() {
AnonymousModule() {
Union("Expression") {
UnionCase("Number", Int())
UnionCase("Variable", String())
UnionCase(
"Add",
[ Field("left", LongIdent("Expression"))
Field("right", LongIdent("Expression")) ]
)
UnionCase(
"Multiply",
[ Field("left", LongIdent("Expression"))
Field("right", LongIdent("Expression")) ]
)
}
|> _.toRecursive()
// Evaluates an expression with a given variable map
Function(
"evaluate",
[ ParameterPat("expr"); ParameterPat("variables") ],
MatchExpr(
"expr",
[ MatchClauseExpr(LongIdentPat("Number", NamedPat("n")), ConstantExpr "n")
MatchClauseExpr(
LongIdentPat("Variable", [ NamedPat("name") ]),
AppExpr("Map.find", [ "name"; "variables" ])
)
MatchClauseExpr(
LongIdentPat("Add", ParenPat(TuplePat([ NamedPat("left"); NamedPat("right") ]))),
InfixAppExpr(
AppExpr("evaluate", [ "left"; "variables" ]),
"+",
AppExpr("evaluate", [ "right"; "variables" ])
)
)
MatchClauseExpr(
LongIdentPat("Multiply", ParenPat(TuplePat([ NamedPat("left"); NamedPat("right") ]))),
InfixAppExpr(
AppExpr("evaluate", [ "left"; "variables" ]),
"*",
AppExpr("evaluate", [ "right"; "variables" ])
)
) ]
)
)
}
}
|> Gen.mkOak
|> Gen.run
|> printfn "%s"
// produces the following code:
|
Mutually Recursive Unions
Discriminated unions in F# can be mutually recursive using the and
keyword. Here's an example from the F# documentation:
Oak() {
AnonymousModule() {
Union("Expression") {
UnionCase("Literal", Int())
UnionCase("Variable", String())
UnionCase(
"Operation",
[ Field("op", String())
Field("left", LongIdent("Expression"))
Field("right", LongIdent("Expression")) ]
)
}
Union("Statement") {
UnionCase("Assign", [ Field("var", String()); Field("value", LongIdent("Expression")) ])
UnionCase("Sequence", [ Field("Statement", List()) ])
UnionCase(
"IfElse",
[ Field("condition", LongIdent("Expression"))
Field("thenBranch", LongIdent("Statement"))
Field("elseBranch", LongIdent("Statement")) ]
)
}
|> _.toRecursive()
}
}
|> Gen.mkOak
|> Gen.run
|> printfn "%s"
// produces the following code:
|
Unwrapping Union Cases
In F#, you can unwrap single-case unions easily:
Oak() {
AnonymousModule() {
// Define a single-case union
Union("ShaderProgram") { UnionCase("ShaderProgram", Int()) }
// Unwrap using pattern matching
Function(
"someFunctionUsingShaderProgram",
[ ParameterPat("shaderProgram") ],
MatchExpr(
"shaderProgram",
[ MatchClauseExpr(
LongIdentPat("ShaderProgram", NamedPat("id")),
// Use the unwrapped value
AppExpr("useShader", [ "id" ])
) ]
)
)
Function(
"someFunctionUsingShaderProgram",
[ ParameterPat("shaderProgram") ],
CompExprBodyExpr(
[ LetOrUseExpr(Value(ParenPat(LongIdentPat("ShaderProgram", "id")), "shaderProgram"))
OtherExpr(UnitExpr()) ]
)
)
}
}
|> Gen.mkOak
|> Gen.run
|> printfn "%s"
// produces the following code:
|
Pattern Matching with Unions
Discriminated unions are powerful when combined with pattern matching. Here's the getShapeWidth
example from the F# documentation:
Oak() {
AnonymousModule() {
Function(
"getShapeWidth",
[ ParameterPat("shape") ],
MatchExpr(
"shape",
[ MatchClauseExpr(
NamePatPairsPat("Rectangle", [ NamePatPairPat("width", "w") ]),
LongIdentSetExpr("w", "w")
)
MatchClauseExpr(
NamePatPairsPat("Circle", [ NamePatPairPat("radius", "r") ]),
InfixAppExpr(Float(2.0), "*", ParenExpr(InfixAppExpr("r", "*", "r")))
)
MatchClauseExpr(
NamePatPairsPat("Prism", [ NamePatPairPat("width", "w") ]),
LongIdentSetExpr("w", "w")
) ]
)
)
}
}
|> Gen.mkOak
|> Gen.run
|> printfn "%s"
// produces the following code:
|
Since F# 9, discriminated unions automatically expose .Is*
properties:
Oak() {
AnonymousModule() {
Union("Contact") {
UnionCase("Email", Field("address", String()))
UnionCase("Phone", [ Field("countryCode", Int()); Field("number", String()) ])
}
Function("canSendEmailTo", ParameterPat("person"), OptVarExpr("person.contact.IsEmail"))
}
}
|> Gen.mkOak
|> Gen.run
|> printfn "%s"
// produces the following code:
|
static member Ast.Oak: unit -> CollectionBuilder<Fantomas.Core.SyntaxOak.Oak,'marker>
--------------------
module Oak from Fabulous.AST
static member Ast.Union: name: string -> CollectionBuilder<Fantomas.Core.SyntaxOak.TypeDefnUnionNode,Fantomas.Core.SyntaxOak.UnionCaseNode>
--------------------
module Union from Fabulous.AST
static member Ast.UnionCase: name: string * fields: (string * WidgetBuilder<Fantomas.Core.SyntaxOak.Type>) list -> WidgetBuilder<Fantomas.Core.SyntaxOak.UnionCaseNode>
static member Ast.UnionCase: name: string * fields: (string * string) list -> WidgetBuilder<Fantomas.Core.SyntaxOak.UnionCaseNode>
static member Ast.UnionCase: name: string * field: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.UnionCaseNode>
static member Ast.UnionCase: name: string * field: WidgetBuilder<Fantomas.Core.SyntaxOak.FieldNode> -> WidgetBuilder<Fantomas.Core.SyntaxOak.UnionCaseNode>
static member Ast.UnionCase: name: string * fields: string list -> WidgetBuilder<Fantomas.Core.SyntaxOak.UnionCaseNode>
static member Ast.UnionCase: name: string * field: WidgetBuilder<Fantomas.Core.SyntaxOak.Type> -> WidgetBuilder<Fantomas.Core.SyntaxOak.UnionCaseNode>
static member Ast.UnionCase: name: string * fields: WidgetBuilder<Fantomas.Core.SyntaxOak.Type> list -> WidgetBuilder<Fantomas.Core.SyntaxOak.UnionCaseNode>
static member Ast.UnionCase: name: string * fields: WidgetBuilder<Fantomas.Core.SyntaxOak.FieldNode> list -> WidgetBuilder<Fantomas.Core.SyntaxOak.UnionCaseNode>
static member Ast.UnionCase: name: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.UnionCaseNode>
--------------------
module UnionCase from Fabulous.AST
<summary> It takes the root of the widget tree and create the corresponding Fantomas node, and recursively creating all children nodes </summary>
static member Ast.PostfixList: decls: WidgetBuilder<Fantomas.Core.SyntaxOak.TyparDeclNode> * constraints: WidgetBuilder<Fantomas.Core.SyntaxOak.TypeConstraint> -> WidgetBuilder<Fantomas.Core.SyntaxOak.TyparDecls>
static member Ast.PostfixList: constraints: WidgetBuilder<Fantomas.Core.SyntaxOak.TypeConstraint> -> WidgetBuilder<Fantomas.Core.SyntaxOak.TyparDecls>
static member Ast.PostfixList: constraints: WidgetBuilder<Fantomas.Core.SyntaxOak.TypeConstraint> list -> WidgetBuilder<Fantomas.Core.SyntaxOak.TyparDecls>
static member Ast.PostfixList: decl: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.TyparDecls>
static member Ast.PostfixList: decl: WidgetBuilder<Fantomas.Core.SyntaxOak.TyparDeclNode> -> WidgetBuilder<Fantomas.Core.SyntaxOak.TyparDecls>
static member Ast.PostfixList: decls: string list -> WidgetBuilder<Fantomas.Core.SyntaxOak.TyparDecls>
static member Ast.PostfixList: decls: WidgetBuilder<Fantomas.Core.SyntaxOak.TyparDeclNode> list -> WidgetBuilder<Fantomas.Core.SyntaxOak.TyparDecls>
static member Ast.PostfixList: decls: string list * constraints: WidgetBuilder<Fantomas.Core.SyntaxOak.TypeConstraint> list -> WidgetBuilder<Fantomas.Core.SyntaxOak.TyparDecls>
static member Ast.PostfixList: decls: WidgetBuilder<Fantomas.Core.SyntaxOak.TyparDeclNode> list * constraints: WidgetBuilder<Fantomas.Core.SyntaxOak.TypeConstraint> list -> WidgetBuilder<Fantomas.Core.SyntaxOak.TyparDecls>
static member Ast.Field: name: string * fieldType: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.FieldNode>
static member Ast.Field: name: string * fieldType: WidgetBuilder<Fantomas.Core.SyntaxOak.Type> -> WidgetBuilder<Fantomas.Core.SyntaxOak.FieldNode>
static member Ast.Field: fieldType: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.FieldNode>
static member Ast.Field: fieldType: WidgetBuilder<Fantomas.Core.SyntaxOak.Type> -> WidgetBuilder<Fantomas.Core.SyntaxOak.FieldNode>
--------------------
module Field from Fabulous.AST
static member Ast.Float: unit -> WidgetBuilder<Fantomas.Core.SyntaxOak.Type>
static member Ast.Attribute: value: string * expr: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.AttributeNode>
static member Ast.Attribute: value: string * expr: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> -> WidgetBuilder<Fantomas.Core.SyntaxOak.AttributeNode>
static member Ast.Attribute: value: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.AttributeNode>
(+0 other overloads)
static member Ast.Member: name: string * body: string * returnType: WidgetBuilder<Fantomas.Core.SyntaxOak.Type> -> WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode>
(+0 other overloads)
static member Ast.Member: name: string * body: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode>
(+0 other overloads)
static member Ast.Member: name: string * body: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * returnType: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode>
(+0 other overloads)
static member Ast.Member: name: string * body: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * returnType: WidgetBuilder<Fantomas.Core.SyntaxOak.Type> -> WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode>
(+0 other overloads)
static member Ast.Member: name: string * body: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode>
(+0 other overloads)
static member Ast.Member: name: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * body: string * returnType: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode>
(+0 other overloads)
static member Ast.Member: name: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * body: string * returnType: WidgetBuilder<Fantomas.Core.SyntaxOak.Type> -> WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode>
(+0 other overloads)
static member Ast.Member: name: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * body: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode>
(+0 other overloads)
static member Ast.Member: name: string * body: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> * returnType: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode>
(+0 other overloads)
static member Ast.MatchExpr: value: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * clause: WidgetBuilder<Fantomas.Core.SyntaxOak.MatchClauseNode> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.MatchExpr: value: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> * clause: WidgetBuilder<Fantomas.Core.SyntaxOak.MatchClauseNode> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.MatchExpr: value: string * clauses: WidgetBuilder<Fantomas.Core.SyntaxOak.MatchClauseNode> list -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.MatchExpr: value: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * clauses: WidgetBuilder<Fantomas.Core.SyntaxOak.MatchClauseNode> list -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.MatchExpr: value: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> * clauses: WidgetBuilder<Fantomas.Core.SyntaxOak.MatchClauseNode> list -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
(+0 other overloads)
static member Ast.MatchClauseExpr: pattern: string * bodyExpr: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.MatchClauseNode>
(+0 other overloads)
static member Ast.MatchClauseExpr: pattern: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * bodyExpr: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.MatchClauseNode>
(+0 other overloads)
static member Ast.MatchClauseExpr: pattern: WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern> * bodyExpr: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.MatchClauseNode>
(+0 other overloads)
static member Ast.MatchClauseExpr: pattern: string * bodyExpr: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> -> WidgetBuilder<Fantomas.Core.SyntaxOak.MatchClauseNode>
(+0 other overloads)
static member Ast.MatchClauseExpr: pattern: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * bodyExpr: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.MatchClauseNode>
(+0 other overloads)
static member Ast.MatchClauseExpr: pattern: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * bodyExpr: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> -> WidgetBuilder<Fantomas.Core.SyntaxOak.MatchClauseNode>
(+0 other overloads)
static member Ast.MatchClauseExpr: pattern: WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern> * bodyExpr: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> -> WidgetBuilder<Fantomas.Core.SyntaxOak.MatchClauseNode>
(+0 other overloads)
static member Ast.MatchClauseExpr: pattern: string * whenExpr: string * bodyExpr: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.MatchClauseNode>
(+0 other overloads)
static member Ast.MatchClauseExpr: pattern: string * whenExpr: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * bodyExpr: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.MatchClauseNode>
(+0 other overloads)
(+0 other overloads)
static member Ast.LongIdentPat: ident: string * pairs: string list -> WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern>
(+0 other overloads)
static member Ast.LongIdentPat: ident: string * pair: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern>
(+0 other overloads)
static member Ast.LongIdentPat: ident: string * pairs: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> list -> WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern>
(+0 other overloads)
static member Ast.LongIdentPat: ident: string * pair: WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern>
(+0 other overloads)
static member Ast.LongIdentPat: ident: string * pairs: WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern> list -> WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern>
(+0 other overloads)
static member Ast.LongIdentPat: pair: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern>
(+0 other overloads)
static member Ast.LongIdentPat: pairs: string list -> WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern>
(+0 other overloads)
static member Ast.LongIdentPat: pair: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern>
(+0 other overloads)
static member Ast.LongIdentPat: pairs: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> list -> WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern>
(+0 other overloads)
static member Ast.InfixAppExpr: lhs: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> * operator: string * rhs: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.InfixAppExpr: lhs: string * operator: string * rhs: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.InfixAppExpr: lhs: string * operator: string * rhs: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.InfixAppExpr: lhs: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * operator: string * rhs: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.InfixAppExpr: lhs: string * operator: string * rhs: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.InfixAppExpr: lhs: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * operator: string * rhs: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.InfixAppExpr: lhs: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> * operator: string * rhs: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.ParenExpr: value: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.ParenExpr: value: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.ParenExpr: value: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
--------------------
module ParenExpr from Fabulous.AST
(+0 other overloads)
static member Ast.AppExpr: name: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * item: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
(+0 other overloads)
static member Ast.AppExpr: name: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> * item: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
(+0 other overloads)
static member Ast.AppExpr: name: string * item: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
(+0 other overloads)
static member Ast.AppExpr: name: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * item: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
(+0 other overloads)
static member Ast.AppExpr: name: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> * item: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
(+0 other overloads)
static member Ast.AppExpr: name: string * item: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
(+0 other overloads)
static member Ast.AppExpr: name: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * item: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
(+0 other overloads)
static member Ast.AppExpr: name: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> * item: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
(+0 other overloads)
static member Ast.AppExpr: name: string * items: string list -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
(+0 other overloads)
static member Ast.ParenPat: pat: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern>
static member Ast.ParenPat: pat: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern>
static member Ast.ParenPat: pat: WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern>
--------------------
module ParenPat from Fabulous.AST
static member Ast.TuplePat: values: string list -> WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern>
static member Ast.TuplePat: values: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> list -> WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern>
static member Ast.TuplePat: value: WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern> list -> WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern>
--------------------
module TuplePat from Fabulous.AST
static member Ast.String: value: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Constant>
static member Ast.String: value: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.Constant>
static member Ast.String: unit -> WidgetBuilder<Fantomas.Core.SyntaxOak.Type>
--------------------
module String from Fabulous.AST
--------------------
module String from Microsoft.FSharp.Core
static member Ast.Int: unit -> WidgetBuilder<Fantomas.Core.SyntaxOak.Type>
(+0 other overloads)
static member Ast.Function: name: string * parameters: string * bodyExpr: string * returnType: WidgetBuilder<Fantomas.Core.SyntaxOak.Type> -> WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode>
(+0 other overloads)
static member Ast.Function: name: string * parameters: string * bodyExpr: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode>
(+0 other overloads)
static member Ast.Function: name: string * parameters: string * bodyExpr: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * returnType: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode>
(+0 other overloads)
static member Ast.Function: name: string * parameters: string * bodyExpr: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * returnType: WidgetBuilder<Fantomas.Core.SyntaxOak.Type> -> WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode>
(+0 other overloads)
static member Ast.Function: name: string * parameters: string * bodyExpr: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode>
(+0 other overloads)
static member Ast.Function: name: string * parameters: string * bodyExpr: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> * returnType: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode>
(+0 other overloads)
static member Ast.Function: name: string * parameters: string * bodyExpr: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> * returnType: WidgetBuilder<Fantomas.Core.SyntaxOak.Type> -> WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode>
(+0 other overloads)
static member Ast.Function: name: string * parameters: string * bodyExpr: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> -> WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode>
(+0 other overloads)
static member Ast.Function: name: string * parameters: WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern> * bodyExpr: string * returnType: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode>
(+0 other overloads)
static member Ast.ParameterPat: name: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern>
static member Ast.ParameterPat: name: WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern>
static member Ast.ParameterPat: name: string * pType: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern>
static member Ast.ParameterPat: name: string * pType: WidgetBuilder<Fantomas.Core.SyntaxOak.Type> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern>
static member Ast.ParameterPat: name: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * pType: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern>
static member Ast.ParameterPat: name: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * pType: WidgetBuilder<Fantomas.Core.SyntaxOak.Type> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern>
static member Ast.ParameterPat: name: WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern> * pType: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern>
static member Ast.ParameterPat: name: WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern> * pType: WidgetBuilder<Fantomas.Core.SyntaxOak.Type> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern>
static member Ast.LongIdent: value: string list -> WidgetBuilder<Fantomas.Core.SyntaxOak.Type>
static member Ast.ConstantExpr: value: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.List: unit -> WidgetBuilder<Fantomas.Core.SyntaxOak.Type>
--------------------
module List from Fabulous.AST
--------------------
module List from Microsoft.FSharp.Collections
--------------------
type List<'T> = | op_Nil | op_ColonColon of Head: 'T * Tail: 'T list interface IReadOnlyList<'T> interface IReadOnlyCollection<'T> interface IEnumerable interface IEnumerable<'T> member GetReverseIndex: rank: int * offset: int -> int member GetSlice: startIndex: int option * endIndex: int option -> 'T list static member Cons: head: 'T * tail: 'T list -> 'T list member Head: 'T member IsEmpty: bool member Item: index: int -> 'T with get ...
static member Ast.CompExprBodyExpr: values: WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode> list -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.CompExprBodyExpr: value: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.CompExprBodyExpr: values: string list -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.CompExprBodyExpr: value: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.CompExprBodyExpr: values: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> list -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.CompExprBodyExpr: values: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> list -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.CompExprBodyExpr: value: WidgetBuilder<Fantomas.Core.SyntaxOak.ComputationExpressionStatement> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.CompExprBodyExpr: values: WidgetBuilder<Fantomas.Core.SyntaxOak.ComputationExpressionStatement> list -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
(+0 other overloads)
static member Ast.Value: name: string * value: string * returnType: WidgetBuilder<Fantomas.Core.SyntaxOak.Type> -> WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode>
(+0 other overloads)
static member Ast.Value: name: string * value: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode>
(+0 other overloads)
static member Ast.Value: name: string * value: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * returnType: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode>
(+0 other overloads)
static member Ast.Value: name: string * value: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * returnType: WidgetBuilder<Fantomas.Core.SyntaxOak.Type> -> WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode>
(+0 other overloads)
static member Ast.Value: name: string * value: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode>
(+0 other overloads)
static member Ast.Value: name: string * value: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> * returnType: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode>
(+0 other overloads)
static member Ast.Value: name: string * value: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> * returnType: WidgetBuilder<Fantomas.Core.SyntaxOak.Type> -> WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode>
(+0 other overloads)
static member Ast.Value: name: string * value: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> -> WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode>
(+0 other overloads)
static member Ast.Value: name: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * value: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * returnType: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode>
(+0 other overloads)
static member Ast.OtherExpr: value: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.ComputationExpressionStatement>
static member Ast.OtherExpr: value: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> -> WidgetBuilder<Fantomas.Core.SyntaxOak.ComputationExpressionStatement>
static member Ast.NamePatPairPat: ident: string * pat: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.NamePatPair>
static member Ast.NamePatPairPat: ident: string * pat: WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern> -> WidgetBuilder<Fantomas.Core.SyntaxOak.NamePatPair>
static member Ast.LongIdentSetExpr: identifier: string * value: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.LongIdentSetExpr: identifier: string * value: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.OptVarExpr: value: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>