F # применить sprintf к списку строк - PullRequest
3 голосов
/ 01 февраля 2011

Как мне лучше всего создать функцию (назовем ее myPrint), которая принимает sprintf, строку формата и список строк в качестве аргументов и дает такой результат, что каждый элемент в списке строк применяется / складывается в sprintf?

то есть

myPrint (sprintf "one: %s two: %s three: %s") ["first"; "second"; "third"];;

даст результат

val myPrint : string = "one: first two: second three: third"

Ответы [ 2 ]

8 голосов
/ 01 февраля 2011

Обратите внимание, что строки формата в F # специально предназначены для приема статически известного числа аргументов, поэтому нет особенно элегантного способа сделать то, что вы хотите. Однако что-то вроде этого должно работать:

let rec myPrintHelper<'a> (fmt:string) : string list -> 'a = function
| [] -> sprintf (Printf.StringFormat<_>(fmt))
| s::rest -> myPrintHelper<string -> 'a> fmt rest s

let myPrint fmt = myPrintHelper<string> fmt

myPrint "one: %s two: %s three: %s" ["first"; "second"; "third"]

Это вызовет исключение во время выполнения, если число "%s" es в вашей строке не соответствует числу строк в списке.

0 голосов
/ 01 февраля 2011
List.map myPrint ["first"; "second"; "third;"]

Вернет новый список sprintf'ed ...

Чтобы просто распечатать на консоль ... List.iter будет перебирать функцию по каждому значению в списке и выполнять эту функцию - но будет работать только с функциями, которые не возвращают значение. (т.е. printf ...)

Карта принимает 'T ->' U - и преобразует список любого формата в любой другой Итак

let myPrint in = sprintf "%s" in

будет разрешено, но прочитайте ваш вопрос еще раз - он не делает то, что вы хотите. - вы можете использовать mapi, который добавляет индекс в (int -> 'T ->' U) и позволит вам определить myPrint как

let myPrint index val = sprintf "%d : %s" index val

Что вернет ["1: первый"; «2: второй»; «3: третий»], который становится ближе ...

Но похоже, что вы хотите вернуть одну строку - так что либо в String.Join на выходе этого - либо используйте fold:

let final = List.fold (fun (builder, index) in -> builder.AppendFormat("{0}: {1}", index, in), index + 1) (new StringBuilder()) ["first"; "second"; "third"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...