Это неудачный угловой вывод типа. Это будет работать:
let (|T|F|) b : Choice<unit,obj -> obj> =
let f (o:obj) : obj = null
if b then T else F(f)
В вашем исходном коде, несмотря на вашу аннотацию (o:obj)
, F # делает вывод, что o
может фактически иметь любой тип 'a
, что приводит к универсальному активному шаблону типа bool -> Choice<unit,'a -> obj>
. Поскольку 'a
является переменной свободного типа, F # не примет это активное определение шаблона. Вы можете увидеть похожую проблему, если сделаете что-то вроде:
let (|T|F|) b =
if b then T else F []
Опять же, решение будет заключаться в том, чтобы мономорфизировать определение:
let (|T|F|) b : Choice<unit,int list> =
if b then T else F []