У меня есть файл CSV с двумя столбцами, текстом и счетчиком. Цель состоит в том, чтобы преобразовать файл из этого:В F #, как использовать Seq.unfold в контексте более крупного конвейера?
some text once,1
some text twice,2
some text thrice,3
Для этого:
some text once,1
some text twice,1
some text twice,1
some text thrice,1
some text thrice,1
some text thrice,1
повторять каждый раз количество строк и распространение графа над тем, что многие линии.
Это кажется мне хорошим кандидатом на Seq.unfold, генерируя дополнительные строки, когда мы читаем файл. У меня есть следующие функции генератора:
let expandRows (text:string, number:int32) =
if number = 0
then None
else
let element = text // "element" will be in the generated sequence
let nextState = (element, number-1) // threaded state replacing looping
Some (element, nextState)
FSI дает следующие функции подписи:
val expandRows : text:string * number:int32 -> (string * (string * int32)) option
Выполнение следующих в FSI:
let expandedRows = Seq.unfold expandRows ("some text thrice", 3)
дает ожидаемый:
val it : seq<string> = seq ["some text thrice"; "some text thrice"; "some text thrice"]
вопрос в том, как я могу подключить это в контексте более крупного конвейера ETL? Например:
File.ReadLines(inFile)
|> Seq.map createTupleWithCount
|> Seq.unfold expandRows // type mismatch here
|> Seq.iter outFile.WriteLine
Ошибка ниже на expandRows в контексте трубопровода.
Type mismatch.
Expecting a 'seq<string * int32> -> ('a * seq<string * int32>) option'
but given a 'string * int32 -> (string * (string * int32)) option'
The type 'seq<string * int 32>' does not match the type 'string * int32'
Я ожидал, что expandRows будет возвращать последовательность строк, как в моем изолированном тесте. Поскольку это не «Ожидание» или «данное», я смущен. Может ли кто-нибудь указать мне в правильном направлении?
Сущность для кода здесь: https://gist.github.com/akucheck/e0ff316e516063e6db224ab116501498
Очень полезное объяснение; именно то, что мне нужно. благодаря! – akucheck
Рад, что я мог помочь. –