Я пытаюсь создать несколько более компактное соглашение о вызове для механизма проверки условий. Рабочий пример кода является:Ограничить тип параметра
type MyType(s:string, i:int) =
member val s = s with get, set
member val i = i with get, set
let StringLenAtLeast10 =
fun (s:string) -> s.Length >= 10
let IntAtLeast10 =
fun (i:int) -> i >= 10
let SelectS =
fun (f:MyType) -> f.s
let SelectI =
fun (f:MyType) -> f.i
type Condition1<'a>(f:'a->bool) =
member this.IsSatisfied obj = f obj
let cond11 = new Condition1<MyType>(fun f -> StringLenAtLeast10 (SelectS f))
let cond12 = new Condition1<MyType>(fun f -> IntAtLeast10 (SelectI f))
Я хотел, чтобы улучшить его немного, ограничивая параметры промежуточного типа, как это:
type Condition2<'a>(selector:'a -> 'b, f:'b->bool) =
member this.IsSatisfied obj = f (selector obj)
let cond21 = new Condition2<MyType>(SelectS, StringLenAtLeast10)
let cond22 = new Condition2<MyType>(SelectI, IntAtLeast10)
Это, однако, не работает, вероятно, по очевидным причинам. Я пытаюсь, a. улучшить соглашения о вызовах, возможно ли это, и b. выяснить, почему он не может определить отношения типа?
/Edit: Как указано в kvb, все параметры типа должны быть явно указаны. Это просто проблема неспособности группировать условия с разными параметрами типа в списке. Так что вместо этого, я воспользовался системой типа, как это:
type Condition<'a>(selector, checker) =
member this.IsSatisfied (obj:'a) = (checker (selector obj)):bool
и типа inteference не позволяет использовать условие как этого
let cond = new Condition<MyType>(SelectS, IntAtLeast10)
, потому что он знает, что выход ВЫБИРАЕТ не принятый ввод в IntAtLeast10.
В то время как это работает, я не могу группировать условия в списке, потому что подписи типов различны. Я нашел относительно простое решение, которое я обновлю после публикации позже. Я принял ваш ответ, потому что он указал мне в правильном направлении. – hvidgaard