Opcjonalne argumenty do funkcji wyższego rzędu

0

Pytanie

Próbuję napisać kotwicy dla socket.io.

Mam problem z funkcją (next() w moim przykładzie kodu na dole), który albo nie przyjmuje argumentu, albo obiekt błędy (Js.Exn.raiseError("ERROR!")).

Nie mogę znaleźć sposób, aby ustalić sygnaturę funkcji, która może przyjmować oba rodzaje argumentów jako pierwszej wartości.

Nie wiem nawet, czy możliwe jest to, o co proszę, w рескрипте, była bym wdzięczna każda pomoc w rozwiązaniu tego problemu w odpowiedni sposób рескрипта.

Moja obecna implementacja wygląda tak:

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

Najlepsza odpowiedź

2

W ogólnym przypadku nie można mieć funkcji ze zmienną liczbą argumentów, ale można wysłać lub undefined lub wartość, która w większości przypadków będzie równoważne.

Jednym ze sposobów, aby to zrobić-wystarczy użyć option Typ. Jeśli zmienimy definicję next jak

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

możemy go używać tak

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

który stworzy następny JavaScript:

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

Innym rozwiązaniem może być korzystanie z opcjonalnych argumentów, ale to chyba nie działa z неторопливостью, i w ostatnim czasie pojawiły się błędy z каррированием, które autor kompilatora, nie wydaje się zainteresowany w poprawce, więc to też może nie zadziałać, ale może warto spróbować:

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

Wreszcie, istnieją pewne skróty dla socket.io (bs-socket.io). Niestety, oni również nie radzą sobie z tą sprawą, ale to może cię uratować, przynajmniej od ponownego wynalezienia niektórych kół.

2021-11-20 18:44:49

W innych językach

Ta strona jest w innych językach

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