Необязательные аргументы для функций более высокого порядка

0

Вопрос

Я пытаюсь написать привязку для socket.io.

У меня возникли проблемы с функцией (next() в моем примере кода внизу), который либо не принимает аргумент, либо объект ошибки (Js.Exn.raiseError("ERROR!")).

Я не могу найти способ определить сигнатуру функции, которая может принимать оба типа аргументов в качестве первого значения.

Я даже не уверен, возможно ли то, о чем я прошу, в рескрипте, была бы признательна любая помощь в решении этой проблемы надлежащим способом рескрипта.

Моя текущая реализация выглядит так:

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

Лучший ответ

2

В общем случае невозможно иметь функцию с переменным числом аргументов, но можно передать либо undefined или значение, которое в большинстве случаев будет эквивалентно.

Один из способов сделать это-просто использовать option Тип. Если мы изменим определение next как

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

мы можем использовать его вот так

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

который создаст следующий JavaScript:

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

Другим вариантом может быть использование необязательных аргументов, но это, похоже, не работает с неторопливостью, и в последнее время появились ошибки с каррированием, которые автор компилятора, похоже, не заинтересован в исправлении, так что это тоже может не сработать, но, возможно, стоит попробовать:

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

Наконец, уже существуют некоторые привязки для socket.io (bs-socket.io). К сожалению, они также не справляются с этим делом, но это может спасти вас, по крайней мере, от повторного изобретения некоторых колес.

2021-11-20 18:44:49

На других языках

Эта страница на других языках

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