可选择参数的高级功能

0

的问题

我尝试写一个具有约束力座。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);
    });

另一种选择可以是使用可选择的论点,但这似乎并没有与工作uncurrying,并于最近有被错误与扩充的编译器,提交人似乎没有兴趣在固定的,所以它不可能在那里工作的,但它可能是值得的一个镜头:

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

最后,目前已经存在一些绑定插座。io(bs-插座。io). 这些还没有处理这种情况下不幸的是,但是它可能会救你从重新发明一些轮子少。

2021-11-20 18:44:49

其他语言

此页面有其他语言版本

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