F # — Извлечь параметр из выражения

#f#

#f#

Вопрос:

Моим вопросам не будет конца…

У меня есть функция:

 let hasMany (expr:Expr<'a -> seq<'b>>)
  

теперь я хочу извлечь seq<'b> из Expr , поскольку мне нужно преобразовать его в ICollection<'b> и обернуть обратно в новый Expr — Почему бы просто не заставить его принимать Expr который принимает ICollection<'b> в первую очередь, вы можете спросить — достаточно просто, пользователю нужно сначала привести seq<'b> к ICollection<'b> , чего я пытаюсь избежать, поскольку я создаю библиотеку, которая будет использоваться другими, кроме меня, и я хочу, чтобы это было легко и чисто.

Кратко: как мне извлечь seq<'b> из Expr ?

Ответ №1:

Ваш вопрос не имеет смысла для меня. Учитывая ваши типы, нет seq<'b> в expr expr это выражение, заключающее в себе функцию, которая возвращает seq<'b> . Например, с имеющейся у вас подписью было бы допустимо вызвать

 hasMany <@ id @>
  

поскольку id может быть задан тип 'b seq -> 'b seq . Однако, очевидно, что <@ id @> не содержит seq<'b> !

Если вы просите преобразовать ваш Expr<'a -> seq<'b>> в Expr<'a -> ICollection<'b>> , то попробуйте это:

 let hasMany (expr : Expr<'a -> 'b seq>) =
    <@ fun x -> (%expr) x :?> ICollection<'b> @>