0

(patten, replacement) 튜플의리스트가 주어진 정규 표현식을 사용하여 원시 텍스트를 정제하고 싶습니다.목록 재귀에서 튜플 유형을 유추 할 수없는 이유는 무엇입니까?

목록 요소에서 일치하는 patten을 사용하려고했지만 실패했습니다. "이 표현식에는 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 

답변

5

, 원하는 경우에는 (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

멋진 두 가지 솔루션이 선호되며 F #은 Regex에서 유형 추정을 수행 할 수 있습니다. 매개 변수 목록을 바꿉니다. 매우 감사합니다. –

0

마지막으로 작동 내가 이것을하려고하면 다음과 같이

코드는

문제가 string * string list 문자열 및 문자열 목록으로 구성된 한 쌍 점이다
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 
관련 문제