To skoro vypadá tak, že by se daly zdrojáky mezi OCaml a F# převádět (přímo nebo přes AST) automagií. Jde to? Protože předpokládám, že F# je přece jen rozšířenější platforma (.NET).
První verze F# kompilátoru (z konce roku 2001) byly napsány v OCamlu. A F# dřívě podporoval syntax OCamlu. Díky této podpoře šlo v OCamlu napsaný F# kompilátor přeložit pomocí F#.
ted nevim jak to myslis. Rozliseni "verbose" a "lightweight" nebo neco jineho?
Ale obecne nejde (dneska) rict, ze Ocaml je dopredne kompatibini F#. To platilo kdysi, dneska se ty jazyky rozesly (ne moc, ale rozesly).
Přepínala se přidáním
#light "off"
na začátek souboru. V posledních verzích je třeba spouštět překladač s přepínačem --mlcompatibility, aby nevyhazoval chyby a varování na OCamlí syntaxi.
Nicméně oba jazyky jsou značně rozdílné. Např. OCaml kontroluje kompatibilitu modulů strukturálně (když má modul funkce správných názvů a typů, tak je to ok), zatímco F# nebo celý .NET kontroluje kompatibilitu tříd nominálně (nestačí, že má metody správných názvů a typů, ale musí být podtypem nějaké třídy nebo rozhraní).
5. 10. 2023, 11:22 editováno autorem komentáře
Nejenom. Rozdíl je v systému modulů, kde OCaml umožňuje moduly parametrizovat jinými moduly (v ML světě se tomu říká aplikativní nebo generativní funktory).
OCaml má silnejší typový systém (např. GADT, polymorfní varianty) a silnější typovou inferenci. Na druhé straně F# má podtypový polymorfismus a OCaml jen řádkový (row) polymorfismus.
OCaml 5 a novější má podporu pro efekty a jejich handlery, což AFAIK není možné udělat v .NET bez podpory runtimu. A lidi od MS zrovna nedávno oznámili, že podpora nebude: https://github.com/dotnet/runtimelab/issues/2398
proste v dobe, kdy OOP bylo povazovano za stribrnou kulku v IT (ugh), tak z funkcionalniho CAMLu udelali OCaml, ze to tam dolepili. Neresili jsme to uz nekdy u prvniho clanku? Kde se zminovalo, ze se nejaka podpora OOP zacala objevovat i v assemblerech a tak. Nebo to bylo jinde?
Tak, nie som expert na Ocaml, ale OOP, ak je robené správne, má veľmi blízko k funkcionálnemu programovaniu. Nevšímajte si ma, ja sa tu len uchechtávam.
nj ale které to je? Vždycky někdo hodí mezi lidi "jó v dobrém OOP", ale pak to utichne. Takže je to class-based šílenost z C++, je to o-interfacovaná ta stejná věc jako v Javě, je to message-based věc ze ST/Erlangu, traity, nebo nějaká akademická varianta? Samé otázky :-)
Jak říká jeden kolega, nejlepší OOP je žádné OOP.
Nicméně vzhledem k tomu, že se moc nechytlo ani původní Kayovo (message-based) OOP, ani to založené na dědičnosti (novější jazyky jako Go, Julia nebo Rust dědění z konkrétních typů nemají), tak možná není to správné žádné.
Akademicky je nejlepší "restrictive OOP", na rozdíl od běžně rozšířeného "ampliative OOP", ale to by byla jalová diskuse.
OOP ma 4 zakladne principy. Dedicnost je jednym z nich. Preco OOP nazyvate 'zalozene na dedicnosti', ostatne principy ignorujeme?
Jelikož dědičnost je v zásadě jediná věc, která je úzce spojená s OOP. Abstrakce, zapouzdření ani polymorfismus se na OOP nevážou.
P.S. OOP ma hodně různých definic, ale pokud jde o podtypy, tak některé varianty ML je mají formou množinové definice a díky koercím je jejich použití transparentní.
A nie je to trochu cheating použiť foldl? V OCaml/F# je to kompletný algoritmus sumy.
Zaujímavé je, že to vytvorí funkciu pre typ aj pre inštanciu. (BTW, funguje aj haskellovský $ pre pipu). C# má tzv. extension methods, ale tam to je oveľa ťažkopádnejšie.
def List.sum' [Add α] [Inhabited α] (l : List α) := l.foldl (λ x y => x + y) default def main: IO Unit := do let vals: List Nat := [1, 2, 3, 4, 5] IO.println vals.sum' let vals: List Nat := [1, 2, 3, 4, 5] IO.println (List.sum' $ vals) let vals: List Int := [-2, -1, 0, 1, 2, 3, 4, 5] IO.println vals.sum' let vals: List Float := [1.1, 2.2, 3.3, 4.4, 5.5] IO.println vals.sum'