Почему нечастичные активные шаблоны не могут быть параметризованы в F#?

Отключите кнопку сохранения во время проверки. Установите его на отключенный как первая вещь, которую проверка делает и повторно включает его, поскольку это заканчивается.

, например,

function UserInputChanged(control) {
    // --> disable button here --< 
    currentControl = control;
    // use setTimeout to simulate slow validation code (production code does not use setTimeout)
    setTimeout("ValidateAmount()", 100); 
}

и

function ValidateAmount() {
    // various validationey functions here
    amount = currentControl.value; // save value to collection
    document.getElementById("Subtotal").innerHTML = amount; // update subtotals
    // --> enable button here if validation passes --<
}

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

13
задан bytebuster 17 May 2015 в 02:56
поделиться

2 ответа

NB. Это именно то, что сказал Брайан, но, надеюсь, сформулировал более ясно.

Я помню, как регистрировал ошибку именно по этой проблеме, и IIRC, это то, что Дон Сайм сказал по этому поводу.

Активная модель с несколькими случаями. - функция преобразования некоторого входного значения в одно из нескольких выходных значений. В вашем примере любой символ преобразуется в регистр Char или в регистр NoChar.

Преимущество этого заключается в том, что компилятор F # вызывает функцию активного шаблона с несколькими регистрами один раз, а затем может обычно определять, какое правило соответствия шаблону оценивать следующим .

Однако, если вы разрешаете параметр, вам необходимо оценить активный шаблон с несколькими регистрами для каждого правила сопоставления с шаблоном.

Итак, представьте себе следующее

match input with
| Alpha "foo" -> ...
| Bravo "bar" -> ...

При оценке (| Alpha | Bravo |) «foo» возвратило «Bravo», тогда первое правило не будет соответствовать. Likeways (| Alpha | Bravo |) "bar" возвращает "Alpha", тогда второе правило тоже не будет соответствовать. Таким образом, у вас действительно нет активного шаблона с несколькими регистрами. Просто параметризованный частичный активный паттерн. (Потому что для некоторых входных данных ожидаемый шаблон-регистр не сработает.)

Итак, когда вы сталкиваетесь с уголком языка, который не имеет большого смысла и на самом деле может быть намного понятнее с помощью частичный параметризованный активный шаблон. Эта функция не была добавлена ​​в язык.

)

Итак, когда вы сталкиваетесь с уголком языка, который не имеет большого смысла и на самом деле может быть намного понятнее с помощью частичного параметризованного активного шаблона. Эта функция не была добавлена ​​в язык.

)

Итак, когда вы сталкиваетесь с уголком языка, который не имеет большого смысла и на самом деле может быть намного понятнее с помощью частичного параметризованного активного шаблона. Эта функция не была добавлена ​​в язык.

13
ответ дан 1 December 2019 в 23:48
поделиться

I can't say for certain (don't know actual design rationale), but trying to reverse-engineer it, what would you expect this code to do?

let (|Char|NoChar|) pred = function    
    | LazyList.Nil -> NoChar    
    | LazyList.Cons (x, _) -> if pred x then Char x else NoChar
let test = function    
    | Char System.Char.IsLetter x -> printfn "Matched as %A" x    
    | NoChar System.Char.IsDigit -> printfn "Didn't match"
test (LazyList.of_list ['a'])
test (LazyList.of_list ['1'])

Given that non-partial active patterns are supposed to partition the whole space, it would be weird if you gave each a different argument inside the same match, because then they might 'both fail' or 'both succeed'. (It's also suggestive of how they may implemented, e.g. just as patterns that capture their argument before doing the match. The captured argument would be invariant across all branches of the match.)

It also suggests that you could write e.g.

let test convf l = 
    let (|Char|NoChar|) = function    
        | LazyList.Nil -> NoChar    
        | LazyList.Cons (x, _) -> Char(convf x)
    match l with
    | Char x -> printfn "Matched as %A" x    
    | NoChar -> printfn "Didn't match"
test System.Char.ToUpper (LazyList.of_list ['a'])

(though I dunno if this is convenient/realistic for your particular app).

4
ответ дан 1 December 2019 в 23:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: