所以我从这个问题中了解到这里我理解timeout操作符错误,如果一个observable在给定的时间窗口内没有发出任何值...我的问题是,这个时间窗口在每次发射后重置,这使得有必要如果您只对窗口内的第一个值发出感兴趣,请完成序列...
有没有一个很好的方法来"超时到第一"?除了.take(1).timeout(1000)?
我非常喜欢创建可以表示无效状态的数据结构,所以我想问一下如何在reasonml 中表示非空列表?
由于可以在列表上进行模式匹配[],[head, ...rest]我认为表示非空列表很容易,但我还没有找到方法。
更新:多亏了下面有启发性的答案,我才能想出一些真正打动我的东西:
module List = {
include List;
type nonEmpty('a) = ::('a, list('a));
let foldNonEmpty = (type a, fn, l: nonEmpty(a)) => switch(l) {
| [head, ...tail] => fold_left(fn, head, tail)
};
}
module Number = {
let min = List.foldNonEmpty(Pervasives.min);
let max = List.foldNonEmpty(Pervasives.max);
}
Number.min([]); // illegal :D
Number.min([1]); // legal
Run Code Online (Sandbox Code Playgroud)
不知道大家怎么看,我觉得挺好看的。谢谢!
我在 ReasonML 上玩了更多,发现type t以下示例中的模式匹配无法处理错误
错误:此模式匹配 t(float) 类型的值,但预期模式匹配 t(int) 类型的值 类型 float 与类型 int 不兼容
type t('a) =
| One: t(int)
| Two: t(float);
let x =
fun
| One => None
| Two => None;
Run Code Online (Sandbox Code Playgroud)
现在在某种程度上,如果这是关于函数的返回类型,这对我来说是有意义的。
我找到了一个等价问题的答案(我认为)。对于第二部分,答案似乎是忽略构造函数的绑定类型。在 ReasonML 中是否可能相同?
Ps:请在术语上迂腐地纠正我,我还在学习什么是什么。
Pps:我知道我可以通过显式键入来解决原始问题,x但我真的很喜欢fun它的语法,因为它很有趣。