Why can't the F # compiler infer the type in this case?

It seems that the p argument in the printPerson function cannot be deduced for Person, but intelisense shows for both printPerson calls that I pass to p: Person. Help me understand what I'm doing wrong?

type Person (name:string) = 
        member e.Name = name

type EmployeeNode = 
    | Leader of Person * int * list<EmployeeNode>
    | Employee of Person * int

let printPerson level p = 
    printfn "%s %s" <| String.replicate (level) "#" <| p.Name 

let rec print node  = 
    match node with
    | Employee(p, level) -> printPerson level p
    | Leader(p, level, nodes) -> 
        printPerson level p
        List.iter print nodes
+4
source share
3 answers

If you work with simple immutable data containers in F #, it will be easier for you to write idiomatic code using the output type, Records , rather than the standard .NET classes.

You would modify the definition Personas follows:

type Person = {Name : string}

If you use a record, you do not need to use type annotation and you can store your code like this:

let printPerson level p = 
    printfn "%s %s" <| String.replicate (level) "#" <| p.Name

, , , .


.NET, , , Name:

type Person (name:string) = 
    member e.Name = name

let printPerson level (p : Person) = 
    printfn "%s %s" <| String.replicate (level) "#" <| p.Name
+5

this.Name, , , Person. , ,

type Person (name : string) =
    member this.Name = name

type School (name : string, address : string) =
    member this.Name = name
    member this.Address = address

let printName x = printfn "%s" x.Name       // This is a type error.

, - Person School. , , , , , .

Intellisense , , , , . , , , .

,

let printPerson level p =

let printPerson level (p : Person) =
+6

printPerson p , Name. , Person, , p Person.

printPerson p , .

+5

Source: https://habr.com/ru/post/1662185/


All Articles