Я пытаюсь реализовать универсальную функцию, которая вызывает член типа. Я обнаружил, что это должно быть возможно, используя inline. Это не помогло, поэтому я попытался реализовать интерфейс, например:Обертка для члена типа
type Wrappable<'a, 'b> =
interface
abstract Wrap : ('b -> 'b) -> 'a
end
type StateType =
State of Scene * Cash | Exit
interface Wrappable<StateType, Scene * Cash> with
member this.Wrap f =
match this with
| Exit -> Exit
| State (scene, cash) -> f (scene, cash) |> State
let inline wrap f (o:Wrappable<_, _>) = o.Wrap f
Это работает очень хорошо, давая выход типа
type Wrappable<'a,'b> =
interface
abstract member Wrap : ('b -> 'b) -> 'a
end
type StateType =
| State of Scene * Cash
| Exit
with
interface Wrappable<StateType,(Scene * Cash)>
end
val inline wrap : f:('a -> 'a) -> o:Wrappable<'b,'a> -> 'b
я нахожу этот способ быть очень некрасиво, хотя , Мой вопрос: есть ли лучший способ обернуть член в функцию?
вы, вероятно, ищете [статический разрешенные параметры типа] (https://msdn.microsoft.com/en-us/library/dd548046.aspx) (вы можете сделать довольно впечатляющие вещи с теми) - I просто интересно, что вы пытаетесь сделать здесь - это просто выбор правильного 'wrap' по типу' o'? – Carsten
Что вы подразумеваете под * wrapping членом в функции? * Единственный член, присутствующий здесь, - это 'Wrap', который (IIUC) вы внедрили для достижения своей цели ... Итак, основной вопрос заключается в том, : Какова ваша цель? –
@MarkSeemann Это все о том, как заставить функцию 'wrap' работать с каждым типом, который имеет член' Wrap'. – seequ