В sbt конфликты между библиотеками настраиваются с помощью диспетчера конфликтов. По умолчанию выбрана последняя ревизия, но это также можно переопределить в файле .sbt:
conflictManager := ConflictManager.strict
Если вы используете sbt 0.13.6 или выше, вы будете предупреждены, если у вас есть несовместимый бинарная версия между вашими зависимостями. В этой ситуации вы можете настроить переопределение в вашем sbt-файле для конкретной библиотеки:
dependencyOverrides += "org.raman" % "Z" % "x.11"
Это заставит разрешенную версию Z
на x.11
, но не приведет к прямой зависимости.
В Эрланге, 5 rem 3.
дает 2
и -5 rem 3.
дает -2
. Если я понимаю ваш вопрос, вам нужно -5 rem 3.
вместо 1 дать 1, поскольку -5 = -2 * 3 + 1.
Это делает то, что вы хотите?
mod(X,Y) when X > 0 -> X rem Y;
mod(X,Y) when X < 0 -> Y + X rem Y;
mod(0,Y) -> 0.
erlang оператор по модулю rem
Eshell V5.6.4 (abort with ^G)
1> 97 rem 10.
7
Остаток Эрланга не работает с отрицательными числами, поэтому вам нужно написать свою собственную функцию для отрицательных параметров.
Вышеупомянутое Y + X rem Y кажется неправильным: либо (Y + X) rem Y, либо Y + (X rem Y) дают неверный результат полученные результаты. Пример: пусть Y = 3. Если X = -4, первая форма возвращает -1, если X = -3 вторая форма возвращает 3, ни одно из которых не находится в [0; 3 [.
Вместо этого я использую это:
% Returns the positive remainder of the division of X by Y, in [0;Y[.
% In Erlang, -5 rem 3 is -2, whereas this function will return 1,
% since -5 =-2 * 3 + 1.
modulo(X,Y) when X > 0 ->
X rem Y;
modulo(X,Y) when X < 0 ->
K = (-X div Y)+1,
PositiveX = X + K*Y,
PositiveX rem Y;
modulo(0,_Y) ->
0.