Ответ 1
Ну, я немного испортил и нашел решение в отчаянии, но я не уверен, что понимаю, почему...
let toleq (e:float<_>) (a:float<_>) (b:float<_>) = (abs ( a - b ) ) < e
Ugh, это почти так же уродливо, как и общие объявления в С#.
Я читал рекламный блок StrangeLights, я прочитал проход от Expert F # (стр. 119), но я не вижу, как они применяются к моему коду:
В моих тестах я хочу проверить равенство между поплавками с небольшим допуском. Я преобразовываю все в единицы измерения, но я хочу быть "общим":
let toleq (e:float<_>) a b = (abs ( a - b ) ) < e
Затем я могу использовать это, чтобы проверить равенство на разных "типах" float или сделать его готовым:
toleqm = toleq 1.0e-10<m>
Но я получаю следующее сообщение:
Type inference has inferred the signature
val toleq : float<'u> -> float<'u> -> float<'u> -> bool
Either define 'toleq' as a simple data term, make it a function, or add a
type constraint to instantiate the type parameters.
Я не вижу, как я могу сделать больше, чтобы сделать его функцией - я не вижу никаких неявных параметров.
Что?
Ну, я немного испортил и нашел решение в отчаянии, но я не уверен, что понимаю, почему...
let toleq (e:float<_>) (a:float<_>) (b:float<_>) = (abs ( a - b ) ) < e
Ugh, это почти так же уродливо, как и общие объявления в С#.