调用 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)}
- 
- 

谁能指出我做错了什么?

(感谢 #smlbgates 在这里为我指明了正确的方向)

以上两个问题。首先,我在调用 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
-