Почему тип кортежа не может быть выведен в список рекурсии?
-
06-07-2019 - |
Вопрос
Я хочу уточнить необработанный текст с помощью регулярного выражения с учетом списка (паттен, замена) кортежа. Р>
Я пытался использовать сопоставление паттерна в элементе списка, но не смог, ошибка показала, что " ожидалось, что это выражение будет иметь тип string * string list, но здесь имеет тип 'list " ;. Р>
Как я могу решить эту проблему? Большое спасибо.
Коды следующие:
let rec refine (raw:string) (rules:string*string list) =
match rules with
| (pattern,replacement) :: rest ->
refine <| Regex.Replace(raw,pattern,replacement) rest
| [] -> raw
Решение
Проблема в том, что string * string list
- это пара, состоящая из строки и списка строк, в то время как вам нужен список (string * string)
: р>
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
Другие советы
Наконец, это работает, когда я пытаюсь это сделать:
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