Соответствие шаблону F # в сигнатуре функции - PullRequest
2 голосов
/ 09 февраля 2012

Почему это не работает?

type RetryBuilder(max) = 
  member x.Return(a) = a               // Enable 'return'
  member x.Delay(f) = f                // Gets wrapped body and returns it (as it is)
                                       // so that the body is passed to 'Run'
  member x.Zero() = failwith "Zero"    // Support if .. then 
  member x.Run(f) =                    // Gets function created by 'Delay'
    let rec loop 0 (Some(ex)) = raise ex
    let rec loop n maybeEx    = try f() with ex -> loop (n-1) (Some(ex))
    loop max None

let retry = RetryBuilder(4)

В нем говорится, что в этом выражении найдены неполные совпадения с образцом.Например, значение «1» может указывать на случай, не охваченный шаблоном.

Но почему это не соответствует приведенному ниже?Если я правильно помню, Haskell соответствовал бы этому, почему не F #?

1 Ответ

5 голосов
/ 09 февраля 2012

Вы пишете код F # в синтаксисе Haskell.Причина, по которой ваш код компилируется, заключается в том, что компилятор F # думал, что есть две loop функции, где первая скрывается за второй.Очевидно, что в первой функции loop сопоставление с образцом завершается неудачно с любым целым числом, отличным от 0 для первого параметра и None для второго параметра.

Объявление, близкое к синтаксису Haskell, может быть:

let rec loop = function 
    | 0, Some ex -> raise ex
    | n, maybeEx -> try f() with ex -> loop (n-1, Some ex)
loop(max, None)
...