패턴과 일치하는 임의의 문자열 (예 : abcd
)과 함께 임의의 glob 구문 파일 (예 : a*c?
)을 생성하는 FsCheck 생성기를 작성했습니다. 그러나 내 솔루션은 가변 변수를 사용하며 오히려 부끄럽습니다. text
가 변경 가능한 방법과 그 값은 루프에 축적된다FsCheck 생성기 목록을 단일 값으로 축적하는 방법은 무엇입니까?
open FsCheck
type TestData = {Pattern: string; Text: string}
let stringFrom alphabet =
alphabet |> Gen.elements |> Gen.listOf |> Gen.map (List.map string >> List.fold (+) "")
let singleCharStringFrom alphabet =
alphabet |> Gen.elements |> Gen.map string
let matchingTextAndPatternCombo = gen {
let toGen = function
| '*' -> stringFrom ['a'..'f']
| '?' -> singleCharStringFrom ['a'..'f']
| c -> c |> string |> Gen.constant
let! pattern = stringFrom (['a'..'c']@['?'; '*'])
let mutable text = ""
for gen in Seq.map toGen pattern do
let! textPart = gen
text <- text + textPart
return {Pattern = pattern; Text = text}
}
공지 것을 : 보라.
내 내장은 text
에 발전기를 fold
할 수있는 방법이 있어야 말해,하지만 난 (아직) 후드 아래 방법 let!
작품을 이해하지 않기 때문에 나는 어떻게 알아낼 수 없습니다. 다음과 비슷한 것을 고려했습니다.
let! text = pattern |> Seq.map toGen |> Seq.fold (?) (Gen.constant "")
올바른 트랙에 있습니까? fold
의 어큐뮬레이터 및 시드는 어떤 모양이어야합니까? fold
같은 것이 여기에 사용될 수 있음을
그동안 나는 다음 누적기를 구상했다 : 재미있는 currGen nextGen -> currGen >> = (재미있는 텍스트 -> nextGen |> Gen.map ((+) text))'. 그러나'Gen.sequence' 접근법은 읽기 쉽고 관용적입니다. 감사! –