小编Cli*_*int的帖子

F#泛型不那么通用

我几次反对这一点,但我真的不知道为什么会发生这种情况.

我有一个受歧视的联盟,如:

type MStep<'A, 'B> =
| Shuttle of Quotations.Expr<'B> * Quotations.Expr<'B>
Run Code Online (Sandbox Code Playgroud)

工会还有更多,但这显示了基本问题.

如果我做:

let s1 = Shuttle(<@ l.SomeIntProp @>, <@ r.SomeIntProp @>)
let s2 = Shuttle(<@ l.SomeStrProp @>, <@ r.SomeStrProp @>)
Run Code Online (Sandbox Code Playgroud)

我收到编译器错误:

该表达式应该具有int类型,但这里有类型字符串

同样,如果我以其他顺序创建它们(字符串然后是int),我得到相同的错误,但反过来.

我可以看到编译器可能会'B根据我的用法进行推断,但是如果我想要'B真正的通用呢?


根据要求,这是一个更完整的例子:

type MStep<'A, 'B> =
    | Shuttle of Quotations.Expr<'B> * Quotations.Expr<'B>
    | Ident of Quotations.Expr<'B>
    | Trans of Quotations.Expr<'A> * Quotations.Expr<'B> * ('A -> 'B)

let doMig (f:Table<'A>, t:Table<'B>, s:('A * 'B -> MStep<'C, 'D> list)) =
    ignore()

let a …
Run Code Online (Sandbox Code Playgroud)

generics f# c#-to-f#

2
推荐指数
1
解决办法
159
查看次数

为什么这段代码似乎出现了错误?

我有CanExecute一个WPF命令看起来有所不同,这取决于我对编译器的明确程度; 问题是,我不希望必须明确.

private bool CanRemoveField()
{
    return SelectedField != null &&
        Context.Item.Id == 0
        ? _fieldsByFieldModel.ContainsKey(SelectedField)
        : !_hasAnyCosts;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码,当查询一个Id != 0保持为真的项时,按钮启用,尽管 SelectedFieldnull,所以我希望条件短路并返回false.

代码略有调整:

private bool CanRemoveField()
{
    return SelectedField != null &&
        (Context.Item.Id == 0
        ? _fieldsByFieldModel.ContainsKey(SelectedField)
        : !_hasAnyCosts);
}
Run Code Online (Sandbox Code Playgroud)

我已经在三元组周围引入了一些括号,并且现在显示了在没有选择字段时禁用按钮的所需行为.

鉴于它是一个三元组,如果,我已经预料到我想要的行为,而不需要括号,因为它应该被视为一个陈述,不是吗?

.net c# wpf compiler-bug

2
推荐指数
2
解决办法
69
查看次数

Rx如何将命令与另一个observable组合

我有一些反应命令以及一些观察者持有一些信息,我正在尝试做类似的事情:

_navigate = ReactiveCommand.Create(CanNavigate);
_navigate.CombineLatest(navigationTarget, (_, tgt) => tgt)
    .Subscribe(tgt => Navigation.NavigateTo(tgt));
Run Code Online (Sandbox Code Playgroud)

我尝试了几种不同的方法:

  1. SelectMany
  2. Zip

我要么最终得到:

  1. 订阅在第一次停止后调用(如果我使用Zip)
  2. 即使命令在执行一次后仍未执行,订阅也会调用

基本上我想要:

每次(并且)在执行命令时触发的可观察对象,以及拉入第二个可观察对象的最新值.

不能完全理解如何最好地实现这一目标......

c# wpf system.reactive reactiveui

1
推荐指数
1
解决办法
764
查看次数

ObMable仍在SelectMany之后订阅

我为WPF应用程序设置了标准的reactive-ui路由,我有一个ViewModel可以实现的接口来提供标题信息.

public interface IHaveTitle
{
    IObservable<string> Title { get; }
}
Run Code Online (Sandbox Code Playgroud)

在一个视图模型中,我正在执行以下操作(用于演示目的):

public IObservable<string> Title => Observable.Interval(TimeSpan.FromSeconds(5)).Select(_ => DateTime.Now.ToLongTimeString());
Run Code Online (Sandbox Code Playgroud)

在我的主窗口屏幕中,我正在执行以下操作:

disposer(
    ViewModel.Router.CurrentViewModel
    .SelectMany(vm =>
        ((vm as IHaveTitle)?.Title.StartWith("") ?? 
            Observable.Return("")).Select(s => string.IsNullOrEmpty(s) ? vm.UrlPathSegment : $"{vm.UrlPathSegment} > {s}"))
    .ObserveOn(RxApp.MainThreadScheduler)
    .BindTo(this, w => w.Title));
Run Code Online (Sandbox Code Playgroud)

disposerAction<IDisposable>传递到this.WhenActivated扩展方法.

现在,当我浏览时,标题确实会改变以反映UrlPathSegment,而在主视图模型上,标题会更新以显示每5秒的时间.

然而,我所看到的问题是,即使我导航到不同的视图模型,主视图模型上的标题可观察仍然会导致标题上的更改.

我的问题是:我如何防止这种情况发生?为什么在我离开时它不会分离,因为我选择的是基于CurrentViewModel

c# wpf system.reactive reactiveui

0
推荐指数
1
解决办法
124
查看次数

标签 统计

c# ×3

wpf ×3

reactiveui ×2

system.reactive ×2

.net ×1

c#-to-f# ×1

compiler-bug ×1

f# ×1

generics ×1