2014-12-25 2 views
1

Я пытаюсь создать несколько более компактное соглашение о вызове для механизма проверки условий. Рабочий пример кода является:Ограничить тип параметра

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.

ответ

3

Все параметры введите тип должен быть четко в своем определении, так что вам нужно сделать:

type Condition2<'a, 'b>(...) = ... 

На месте вызова можно опустить new ключевое слово и явные параметры, и они, как правило, будет

let cond21 = Condition2(SelectS, StringLenAtLeast10) 
+0

В то время как это работает, я не могу группировать условия в списке, потому что подписи типов различны. Я нашел относительно простое решение, которое я обновлю после публикации позже. Я принял ваш ответ, потому что он указал мне в правильном направлении. – hvidgaard

Смежные вопросы