Являются ли эти эквиваленты? Почему есть 2 способа сделать одно и то же?
Нет, и нет. Ваш «функтор» недействителен, что вы могли бы легко узнать, попробовав его самостоятельно.
Функторы и ограничения модуля (ie. with type ...
) работают в разных областях. Функторы работают с реализациями, а ограничения модуля работают с сигнатурами / типами. Кроме того, ограничения модуля берут существующую сигнатуру и добавляют к ней информацию (ограничение), в то время как функторы принимают реализацию модуля в качестве параметра, но не расширяют ее или нуждаются во входных и выходных сигнатурах, чтобы вообще иметь какое-либо отношение друг к другу. .
Вы можете использовать функтор для общего расширения реализаций , используя include
, как описано выше. Но так как подпись аргумента является stati c, его повторное использование и, следовательно, его полезность ограничены:
module A (B1: B) = struct
include B
let x = 42
end