Проблема в том, что функция min3
скомпилирована как универсальная функция, которая использует общее сравнение (я думал, что это просто IComparable
, но на самом деле это более сложно - это будет использовать структурное сравнение для типов F #, и это довольно сложная логика).
> let min3(a, b, c) = min a (min b c);;
val min3 : 'a * 'a * 'a -> 'a when 'a : comparison
В версии C # функция не является универсальной (просто требуется int
). Вы можете улучшить версию F #, добавив аннотации типов (чтобы получить то же самое, что и в C #):
let min3(a:int, b, c) = min a (min b c)
... или сделав min3
равным inline
(в этом случае он будет специализирован для int
при использовании):
let inline min3(a, b, c) = min a (min b c);;
Для случайной строки str
длины 300 я получаю следующие числа:
> levenshtein str ("foo" + str);;
Real: 00:00:03.938, CPU: 00:00:03.900, GC gen0: 275, gen1: 1, gen2: 0
val it : int = 3
> levenshtein_inlined str ("foo" + str);;
Real: 00:00:00.068, CPU: 00:00:00.078, GC gen0: 0, gen1: 0, gen2: 0
val it : int = 3