gpt4 book ai didi

interop - 高阶函数的可选参数

转载 作者:行者123 更新时间:2023-12-04 14:46:05 29 4
gpt4 key购买 nike

我尝试为 socket.io 编写一个绑定(bind)。
我在使用函数(底部示例代码中的 next())时遇到问题,该函数要么不带参数,要么带有错误对象( Js.Exn.raiseError("ERROR!") )。
我找不到定义可以将两种类型的参数作为第一个值的函数签名的方法。
我什至不确定,如果我要求的内容可以在 rescript 中实现,任何以正确 rescript 方式解决该问题的帮助,将不胜感激。
我目前的实现是这样的:

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)

最佳答案

通常不可能有一个带有可变数量参数的函数,但可以传递 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,而且最近有一些 currying 错误,编译器作者似乎没有兴趣修复,所以它可能也无法在那里工作,但它可能值得一试:
type next = (~error: int=?, unit) => unit
...
io->use((_socket, next) => {
next(())
next(~error=42, ())
})
最后,socket.io ( bs-socket.io ) 已经存在一些绑定(bind)。不幸的是,这些也不能处理这种情况,但它至少可以使您免于重新发明一些轮子。

关于interop - 高阶函数的可选参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70046138/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com