键入错误调用选择标准ML

时间:2015-06-05 22:37:48

标签: sockets select sml

我试图致电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)}
- 
- 

有人能指出我做错了吗?

1 个答案:

答案 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 {
...