В Python можно использовать printf как форматирование с оператором "%":
"i am %d years old" % 99
или
"%s is %d years old" % ("bob", 101)
Существует ли способ получить тот же краткий синтаксис в Ocaml для произвольных чисел аргументов?
Для отдельного аргумента, следующих работ:
let (%) = Printf.sprintf in ... "i am %d years old" % 99
Существует ли путь, который работает на произвольные числа аргументов?
Теоретически, не кажется более сложным использовать формат для получения типа (typ1 * typ2 * ... * typn) -> string
чем typ1 -> typ2 -> ... -> typn -> string
. То есть, возможно, за исключением рекурсивных форматов %( fmt %)
. Кто-нибудь на самом деле их использует?
На практике, однако, реализаторы OCaml выбрали вторую форму, и реализовали взлом системы типов для этой формы, а не для первой. Так что, боюсь, ответ на этот вопрос таков: за неимением исправления компилятора, вы застряли с curried формой подстановки строки формата.
Это зависит от того, что вы подразумеваете под произвольным числом аргументов:
Я не верю, что есть способ написать функцию в OCaml, которая может принимать и распаковывать кортеж произвольной арности (например, , оба (1, «bob»)
и («joe», «bob», «briggs»)
).
Caml способ обработки нескольких аргументов не через кортежи, а путем каррирования. Если вы хотите это сделать, вы можете просто использовать Printf.sprintf
.
Если вам действительно нужен инфиксный оператор, например, что-то вроде
"% s-% s% s - лучший обозреватель фильмов"% "joe" "bob" "briggs"
тогда вам не повезло, потому что приложение-функция связывает более жестко, чем любой инфиксный оператор . Вы можете написать
("% s-% s% s - лучший рецензент фильмов"% "joe") "bob" "briggs"
, но мне это кажется неважным - не дроидов, которых вы ищете.
Итак, если ваш вопрос:
Могу ли я определить в Objective Caml инфиксную версию
sprintf
, которая принимает произвольное количество аргументов?
Ответ это нет.
Просто вычтите число:
> as.Date("2009-10-01")
[1] "2009-10-01"
> as.Date("2009-10-01")-5
[1] "2009-09-26"
Поскольку класс Date
имеет только дни, над ним можно просто выполнить базовую арифметику.
Если вы хотите использовать POSIXlt по какой-либо причине, то вы можете использовать слоты POSIXlt:
> a <- as.POSIXlt("2009-10-04")
> names(unclass(as.POSIXlt("2009-10-04")))
[1] "sec" "min" "hour" "mday" "mon" "year" "wday" "yday" "isdst"
> a$mday <- a$mday - 6
> a
[1] "2009-09-28 EDT"
-121--1095061- Может быть, вы можете использовать библиотеку typeinfo, с ней вы можете теперь класс объектов во время выполнения. Пример:
#include<iostream>
#include<typeinfo>
class A{};
int main()
{
A a;
std::cout<<typeid(a).name();
}
Вы можете увидеть больше в: http://www.cplusplus.com/reference/std/typeinfo/
[]
-121--3909698-Это звучит как работа для Camlp4 !