我正在研究一些F#并试图像本教程中那样实现一个解析器组合器; 在对提议的解决方案进行一些复制和粘贴之后,我尝试自己进行自定义.
当然有一些我错过了,但编译器给了我一个奇怪的错误信息.
type T<'a> =
| A of string
| B of 'a
let foo a b =
match a with
| A s as x -> x
| B i ->
match b with
| A s as x -> x
| B j ->
B (i, j)
Run Code Online (Sandbox Code Playgroud)
上面的代码是我发现的问题的概括:在最后的结果(最里面的匹配表达式的B分支)中通知错误:
error FS0001: Type mismatch. Expecting a
'a
but given a
'a * 'b
The resulting type would be infinite when unifying ''a' and ''a * 'b'
Run Code Online (Sandbox Code Playgroud)
但如果我不使用该 …
我正在编写一个套接字服务器,它应该处理从连接到它的每个客户端收到的每条消息。
所有的消息都在一个可观察的队列中,所以它可以被订阅并在外面观察。
为了确保所有客户端套接字消息都放在同一个 observable 上,我使用了以下代码段:
private Subject<IObservable<Msg>> _msgSubject;
public IObservable<Msg> Messages { get; private set; }
public SocketServer()
{
// ...
// Initialization of server socket
// ...
_msgSubject = new Subject<IObservable<Msg>>();
Messages = _msgSubject.Merge();
}
private void OnNewConnection(ISocket socket)
{
var evtObservable = Observable.FromEvent<Action<byte[]>, byte[]>(action => action.Invoke, h => socket.OnMessage += h, h => socket.OnMessage -= h);
_msgSubject.OnNext(evtObservable);
}
Run Code Online (Sandbox Code Playgroud)
现在,我检查了内存的(解除)分配,问题是即使套接字正确关闭,仍然有相对可观察对象的引用添加到主题中;此外,永远不会取消事件的注册。
那么,问题来了:有没有办法强制从主题中删除“socket observable”?
也许触发套接字 observable 的 OnComplete 的东西应该可以完成这项工作,但是如何呢?
我是RX的新手,我正面临"塑造通知流量"的问题.
我想知道如何通过给定的吞吐量通知观察者; 也就是说,我希望在自上次"OnNext"调用后经过一段给定时间之前调用"OnNext"方法.
为了完整起见:我希望通知序列中的每个元素.
例如,0.2符号/刻度:
Tick: 0 10 20 30
|---------|---------|---------|
Producer: A---B------C--D-----E-------F
Result: A B C D E F
0 5 11 16 21 28
Run Code Online (Sandbox Code Playgroud)
有没有办法组成观察者或我必须实现我自己的主题?
非常感谢