2016-03-06 3 views
3

У меня есть модуль проверки скопированный из Railway oriented programming, который выполняет обработку ошибок в моем приложении:Ошибка компиляции для композиции Клейла

type ErrorMessage = ErrorMessage of string 

type ValidationResult<'T> = 
    | Success of 'T 
    | Error of ErrorMessage 

module ValidationResult =  
    let doubleMap successHandler errorHandler = function 
     | Success x -> successHandler x 
     | Error e -> errorHandler e 

    let bind f = function 
     | Success x -> f x 
     | Error e -> Error e 

    let (>=>) f g = f >> bind g 

Я проверял состав Клейл, используя следующие функции тестирования:

let validation1 (list: int list) = 
    if List.length list = 6 
    then Success list 
    else Error <| ErrorMessage "Length error" 

let validation2 list = 
    if List.forall (fun x -> x > 6) list 
    then Success list 
    else Error <| ErrorMessage "All elements must be larger than 6" 

let combined = validation1 >=> validation2 
           //^^^^^^^^^^^^ compile error 

Насколько я понимаю, validation1 и validation2 должны составлять, потому что оба имеют тип int list -> ValidationResult<int list>. Однако у меня возникла ошибка компиляции

Ожидающий тип, поддерживающий оператор '> =>', но с заданной функцией . Возможно, вам не хватает аргумента функции.

Как я могу это решить?

+2

Вы забыли открыть функцию ValidationResult? –

+0

@FyodorSoikin, какая глупая ошибка от меня ... не понимала, что это просто. Если вы поместите свой комментарий в качестве ответа, я с радостью приму его. благодаря – rexcfnghk

ответ

6

Кажется, что вы просто забыли open ValidationResult, поэтому ваш оператор композиции не в области.

Для нормальной функции F # пожаловался бы, что символ не определен. Но операторы - это другое дело.

Операторы могут быть определены двумя способами: как автономная функция (функциональный способ) или как статический член на одном из типов, переданных оператору (путь .NET). В первом случае функция должна быть видимой в области видимости, но в последнем случае это не так: до тех пор, пока вам удалось получить объект с оператором, определенным как статический член, вам не нужно иметь его вид виден.

Вот почему F # говорит, что он «ожидал, что оператор поддержки типа» вместо «функция не определена».

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