Как опубликовать видео в реальном времени с несколькими битрейтами (MBR)?

Я искал немало тем:

http: //www.developsigner. let exprNonGeneric = x.Name) @@> Полученная цитата выглядит так: val exprNonGeneri: ...

Допустим, у нас есть простая цитата F #:

type Pet = {  Name : string }
let exprNonGeneric = <@@ System.Func(fun (x : Pet) -> x.Name) @@>

Результирующая цитата выглядит следующим образом:

val exprNonGeneri : Expr =
  NewDelegate (System.Func`2[[FSI_0152+Pet, FSI-ASSEMBLY, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]],
             x, PropertyGet (Some (x), System.String Name, []))

Теперь я хочу обобщить это, поэтому я вместо типа «Pet» и свойства «Name» мог бы использовать произвольный тип и метод / свойство, определенные для него. Вот что я пытаюсь сделать:

let exprGeneric<'T, 'R> f = <@@ System.Func<'T, 'R>( %f ) @@>
let exprSpecialized = exprGeneric <@ (fun (x : Pet) -> x.Name) @>

Результирующее выражение теперь отличается:

val exprSpecialized : Expr =
  NewDelegate (System.Func`2[[FSI_0152+Pet, FSI-ASSEMBLY, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]],
             delegateArg,
             Application (Lambda (x,
                                  PropertyGet (Some (x), System.String Name, [])),
                          delegateArg))

Как видите, разница между первым и вторым выражением заключается в том, что в первом случае выражение NewDelegate верхнего уровня содержит PropertyGet, тогда как второе выражение оборачивает PropertyGet в выражение Application / Lambda. И когда я передаю это выражение во внешний код, оно не ожидает такой структуры выражения и завершается ошибкой.

Поэтому мне нужен какой-то способ построения обобщенной версии цитаты, поэтому, когда она становится специализированной, результирующая цитата является точным соответствием x.Name) @ @>. Это возможно? Или есть только выбор, чтобы вручную применить сопоставление с образцом к сгенерированной цитате и преобразовать его в то, что мне нужно?

ОБНОВЛЕНИЕ . В качестве обходного пути я реализовал следующий адаптер:

let convertExpr (expr : Expr) =
    match expr with
    | NewDelegate(t, darg, appl) ->
        match (darg, appl) with
        | (delegateArg, appl) ->
            match appl with 
            | Application(l, ldarg) ->
                match (l, ldarg) with
                | (Lambda(x, f), delegateArg) ->
                    Expr.NewDelegate(t, [x], f)
                | _ -> expr
            | _ -> expr
    | _ -> expr

Он выполняет свою работу - теперь я могу преобразовать выражение из 1-й формы во 2-ю. Но мне интересно узнать, можно ли это сделать простым способом, не обходя деревья выражений.

6
задан Vagif Abilov 5 August 2010 в 10:49
поделиться