Проблема в том, что 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