作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试为 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/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!