Próbuję zaimplementować rodzajowe funkcji timera w SML, który zabierze jako wejście funkcji arbitralnej liczbę operandów i typ „R Wróć i zwraca funkcję z:generic zegar funkcja high-order w SML
- tej samej budowie i rodzaje parametrów wejściowych i
- typu powrotu
float * 'r
którym pływak będzie metryki czasu spędzonego w funkcji (na przykład donosiSys.time()
)
Problem polega na tym, że nie mogę go wdrożyć w taki sposób, aby mógł obsłużyć funkcje dowolnej arii. Na przykład. następujący kod:
let timer f = let timerf x y = let t0 = Sys.time() in let result = f x y in let diff = Sys.time() -. t0 in diff, result in timerf
działa tylko z funkcjami wejścia liczbę operandów 2. To nie jest dla mnie oczywiste, w jaki sposób uogólnić go obsługiwać funkcje dowolnego liczbę operandów. Miałem nadzieję, że aplikacje o częściowej funkcji w jakiś magiczny sposób rozwiążą zagadkę, ale nie mogę jej uruchomić.
Jeśli wiesz, że funkcja nie robi nic ciekawego po zastosowaniu częściowo (jak większość funkcji), to nie potrzebujesz nawet abstrakcji. Wystarczy wywołać 'timer (g x1 x2 ... xN-1) xN'. –
@AndreasRossberg: Dzięki, włączyłem twój punkt do mojej odpowiedzi. – pad