Почему тип кортежа не может быть выведен в список рекурсии? - PullRequest
0 голосов
/ 29 ноября 2009

Я хочу уточнить необработанный текст с помощью регулярного выражения, учитывая список (паттен, замена) кортежа.

Я попытался использовать сопоставление паттерна в элементе списка, но потерпел неудачу, ошибка показала, что «ожидалось, что это выражение будет иметь тип строка * список строк, но здесь имеет тип« список ».

Как я могу исправить эту проблему? Большое спасибо.

Коды следующие:

let rec refine (raw:string) (rules:string*string list) = 
    match rules with
    | (pattern,replacement) :: rest ->
        refine <| Regex.Replace(raw,pattern,replacement) rest
    | [] -> raw

Ответы [ 2 ]

5 голосов
/ 29 ноября 2009

Проблема в том, что string * string list - это пара, состоящая из строки и списка строк, тогда как вы хотите (string * string) list:

let rec refine (raw:string) (rules:(string*string) list) =
    match rules with
    | (pattern,replacement) :: rest ->
        refine (Regex.Replace(raw,pattern,replacement)) rest
    | [] -> raw

Кроме того, единственная причина, по которой вам нужна эта конкретная аннотация, заключается в том, что Regex.Replace перегружен. Вот почему ваше другое решение работает, но есть другие (более минимальные) места, где вы можете разместить аннотацию, которая будет работать:

let rec refine (raw:string) rules =
    match rules with
    | (pattern,replacement:string) :: rest ->
        refine (Regex.Replace(raw,pattern,replacement)) rest
    | [] -> raw
0 голосов
/ 29 ноября 2009

Наконец, это работает, когда я пытаюсь это:

let rec refine (raw:string) rules = 
    match rules with
    | rule :: rest ->
        //get tuple values beyond the patten matching
        let (pattern:string,replacement:string) = rule 
        refine (Regex.Replace(raw,pattern,replacement)) rest
    | [] -> raw
...