调用 select 标准 ML 时出现类型错误
Type error calling select Standard ML
我正在尝试调用 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)}
-
-
谁能指出我做错了什么?
(感谢 #sml
的 bgates
在这里为我指明了正确的方向)
以上两个问题。首先,我在调用 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 {
...
随着这些变化...
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 { rds, exs, wrs } = Socket.select {
rds = descs [server],
wrs = descs [],
exs = descs clients,
timeout = (SOME (Time.fromSeconds 10))
}
in
(rds, wrs, exs)
end ;;
= = = = = = = = = [autoloading]
[autoloading done]
val selecting = fn
: ('a,'b) Socket.sock
-> ('c,'d) Socket.sock list
-> Socket.sock_desc list * Socket.sock_desc list *
Socket.sock_desc list
-
我正在尝试调用 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)}
-
-
谁能指出我做错了什么?
(感谢 #sml
的 bgates
在这里为我指明了正确的方向)
以上两个问题。首先,我在调用 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 {
...
随着这些变化...
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 { rds, exs, wrs } = Socket.select {
rds = descs [server],
wrs = descs [],
exs = descs clients,
timeout = (SOME (Time.fromSeconds 10))
}
in
(rds, wrs, exs)
end ;;
= = = = = = = = = [autoloading]
[autoloading done]
val selecting = fn
: ('a,'b) Socket.sock
-> ('c,'d) Socket.sock list
-> Socket.sock_desc list * Socket.sock_desc list *
Socket.sock_desc list
-