Volitelné argumenty funkce vyššího řádu

0

Otázka

Pokusím napsat závazné pro zásuvky.io.

Mám potíže s funkce (next() v mém příkladu kódu v dolní části), který buď bere žádný argument nebo chyba objekt (Js.Exn.raiseError("ERROR!")).

Nemůžu najít způsob, jak funkci definovat podpis, který může mít oba typy argument jako první hodnota.

Nejsem si ani jistý, jestli to, co žádám, je možné v edikt, pomoci vyřešit tento problém v řádné edikt způsob, chtěl bych být ocenil.

Moje současná implementace vypadá takto:

type server
type socket
type next = (. unit) => unit 

@new @module("socket.io") external socketIO: unit => server = "Server"
@send external use: (server, (socket, next) => unit) => unit = "use"
@send external listen: (server, int) => unit = "listen"
@send external on: (server, @string [ #connection(socket => unit) ] ) => unit = "on"

let io = socketIO()

io->use((socket, next) => {
    Js.log("FIRST")
    next(.)
})

io->use((socket, next) => {
    Js.log("SECOND")
    next(.)
})

io->on(#connection(socket => 
    Js.log("CONNECT")
))

io->listen(3000)
1

Nejlepší odpověď

2

To není možné v obecné mít funkce s proměnným počtem argumentů, ale je možné projít buď undefined nebo hodnota, která ve většině případů bude ekvivalentní.

Jeden způsob, jak to udělat, je jednoduše použít option typ. Pokud bychom re-definovat next jako

type next = (. option<int>) => unit 

můžeme použít to takhle

io->use((_socket, next) => {
    next(. None)
    next(. Some(42))
})

který bude generovat následující JavaScript:

io.use(function (_socket, next) {
      next(undefined);
      return next(42);
    });

Další možností by mohlo být použití volitelné argumenty, ale nezdá se, že pracovat s uncurrying, a v poslední době tam byly chyby s nosnými že kompilátor autor zdá se, že nemají zájem na upevnění, takže to nemusí fungovat ani tam, ale to může být stojí za to zkusit:

type next = (~error: int=?, unit) => unit
...
io->use((_socket, next) => {
    next(())
    next(~error=42, ())
})

A konečně, existuje již nějaké vazby pro zásuvky.io (bs-socket.io). Tyto také nedisponuji tomto případě bohužel, ale to by vás zachránil od re-vynalézat něco, co jezdí minimálně.

2021-11-20 18:44:49

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................