Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: fortran1986 04. 11. 2025, 18:32:08
-
F# ma oproti OCAML taku vymoženosť, že si viem pomenovať typy parametrov aj vrámci typovej signatúry funkcie
type foo = bool -> bool
vs.
type foo = isEmpty:bool -> bool
alebo pri algebraických typoch:
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:
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
-
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):
let findUniqueSlug slugExists slug = findUniqueName' 0 slugExists slug
-
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):
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):
(https://i.postimg.cc/342tMLcZ/Discriminated-Union.png) (https://postimg.cc/342tMLcZ)
(https://i.postimg.cc/wyDwKWGw/Function-Type.png) (https://postimg.cc/wyDwKWGw)
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é.
-
no jazyk to podporuje, ale vyzerá, že editor nie (podporuje pri discriminated unions, ale už nie pri typoch funkcie čo je divná nekonzistencia):
Explicitně předat ty parametry nechcete? Takto:
let findUniqueName nameExists name = findUniqueName' 0 nameExists name
To je totiž jediné, kde mi IDE zachová i jejich jména. Nejspíš se oboje i trochu jinak překládá. A pak z pohledu typového systému to moje je hodnota (value) a to vaše ne (částečné aplikace funkcí nejsou hodnoty kvůli value restriction - nesmí se totiž generalizovat).