F# pomenované typy v typovej signatúre funkcie

F# ma oproti OCAML taku vymoženosť, že si viem pomenovať typy parametrov aj vrámci typovej signatúry funkcie

Kód: [Vybrat]
type foo = bool -> bool
vs.
type foo = isEmpty:bool -> bool

alebo pri algebraických typoch:

Kód: [Vybrat]
type Person =
| Man of name:string * age:int
| Woman of name:string * age:int * cupSize:CupSize


pri typoch tagu v dicriminated unions to vieme pomenovať a zobrazí to aj autocomplete, lenže skúšam pomenovať funkcie vrátené po curryingu a tam to dáko autocomplete nezobrazí, nemáte pls tip či sa to nedá nejako ohackovať? Lebo tu je konktrétny príklad z praxe:

Kód: [Vybrat]
module Name

let rec private findUniqueName' (index : int) (exists : string -> bool) (name : string) =
    let newName = if index = 0 then name else $"{name}-{index}"
    if exists(newName)
    then name |> findUniqueName' (index + 1) exists
    else newName

// typy explicitne netreba uvadzat ale chcem to mat pomenovane koli autocomplete:
let findUniqueName : nameExists:(string -> bool) -> name:string -> string = findUniqueName' 0

let rec private findUniqueSlug' (index : int) (slugExists : string -> bool) (name : string) =
    name
    |> _.ToSlug()
    |> findUniqueName' 0 slugExists

let findUniqueSlug : slugExists:(string -> bool) -> slug:string -> string = findUniqueSlug' 0


Re:F# pomenované typy v typovej signatúre funkcie
« Odpověď #1 kdy: Dnes v 20:02:16 »
F# ma oproti OCAML taku vymoženosť, že si viem pomenovať typy parametrov aj vrámci typovej signatúry funkcie

No, v F# se to pojmenování na rozdíl od OCamlu snadno ztratí. Když použijete labelled parameter v OCamlu, tak argument musí být labelled (např. když deklaruji let rec range ~first:lo ~last:hi = ..., tak to musím volat range ~first:1 ~last:10 a nejde range 1 10)


Čekal bych, že když findUniqueSlug bude funkce, tak by to mohlo fungovat (ale AFAIK není to nic, co by bylo garantováno specifikací jazyka):

Kód: [Vybrat]
let findUniqueSlug slugExists slug = findUniqueName' 0 slugExists slug
« Poslední změna: Dnes v 20:04:54 od Radek Miček »

Re:F# pomenované typy v typovej signatúre funkcie
« Odpověď #2 kdy: Dnes v 20:18:54 »
F# ma oproti OCAML taku vymoženosť, že si viem pomenovať typy parametrov aj vrámci typovej signatúry funkcie

No, v F# se to pojmenování na rozdíl od OCamlu snadno ztratí. Když použijete labelled parameter v OCamlu, tak argument musí být labelled (např. když deklaruji let rec range ~first:lo ~last:hi = ..., tak to musím volat range ~first:1 ~last:10 a nejde range 1 10)


Čekal bych, že když findUniqueSlug bude funkce, tak by to mohlo fungovat (ale AFAIK není to nic, co by bylo garantováno specifikací jazyka):

Kód: [Vybrat]
let findUniqueSlug slugExists slug = findUniqueName' 0 slugExists slug

no jazyk to podporuje, ale vyzerá, že editor nie (podporuje pri discriminated unions, ale už nie pri typoch funkcie čo je divná nekonzistencia):





lebo už som sa pýtal aj AI a nič mi neporadila. v špecifikácii to možno nie je, ale bolo by fajn keby pridali podporu predsa len aj na úrovni editorov / IDE. Lebo ozaj keď niektoré veci nie sú pomenované tak to je násobne menej prehľadné.