#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> @>