我试图致电Socket.select
来处理一些套接字。看起来我的代码中的以下最小片段应该有用......
fun descs ss = map Socket.sockDesc ss
fun selecting server clients =
let val { ss, ws, cs } = Socket.select {
rds = descs [server],
wds = descs [],
exs = descs clients,
timeout = (SOME (Time.fromSeconds 10))
}
in
(ss, ws, cs)
end
...但我在SML/NJ
评估时没有:
Standard ML of New Jersey v110.76 [built: Thu Feb 19 00:37:13 2015]
- fun descs ss = map Socket.sockDesc ss ;;
[autoloading]
[library $SMLNJ-BASIS/basis.cm is stable]
[autoloading done]
val descs = fn : ('a,'b) Socket.sock list -> Socket.sock_desc list
- fun selecting server clients =
let val { ss, ws, cs } = Socket.select {
rds = descs [server],
wds = descs [],
exs = descs clients,
timeout = (SOME (Time.fromSeconds 10))
}
in
(ss, ws, cs)
end ;;
= = = = = = = = = [autoloading]
[autoloading done]
stdIn:3.13-8.7 Error: operator and operand don't agree [tycon mismatch]
operator domain: {exs:Socket.sock_desc list, rds:Socket.sock_desc list,
timeout:Time.time option, wrs:Socket.sock_desc list}
operand: {exs:Socket.sock_desc list, rds:Socket.sock_desc list,
timeout:Time.time option, wds:Socket.sock_desc list}
in expression:
Socket.select
{rds=descs (server :: nil),wds=descs nil,exs=descs clients,
timeout=SOME (Time.fromSeconds 10)}
-
-
有人能指出我做错了吗?
答案 0 :(得分:3)
(感谢来自bgates
的{{1}}让我指出了正确的方向)
以上两个问题。首先,我在调用#sml
时的构造函数名称中输入了一个拼写错误。
Socket.select
其次,在记录上进行模式匹配时,必须使用记录的插槽名称而不是任意符号。所以
...
rds = descs [server],
wrs = descs [], (* `wrs` instead of `wds` here *)
exs = descs clients,
...
实际应该是
...
let val { ss, ws, cs } = Socket.select {
...
随着这些变化......
...
let val { rds, wrs, exs } = Socket.select {
...