Я пытаюсь получить все повороты списка v
.Итак, в определении rotations
я использую перевернутую версию rotateLeft
в качестве первой функции ветвления (для того, чтобы сначала принять список), а затем функцию, которая возвращает список [0, 1, 2, ..., v.length-1]
, с map
в качествесходящаяся функция.
const {curry,mathMod,pipe,splitAt,reverse,unnest,converge,map,flip,length,times,identity} = require("ramda");
const v = [1,2,3,4];
const rotateLeft = curry((n,vet) => {
const i = mathMod(n,vet.length);
return pipe(
splitAt(i),
reverse,
unnest
)(vet);
});
const rotations = converge(map,[
flip(rotateLeft),
pipe(length,times(identity))
]);
rotations(v);
Однако, это не возвращает того, что я ожидал.Вместо этого он работает нормально, если я переписываю это следующим образом:
map(flip(rotateLeft)(v),
pipe(length,times(identity))(v));
// gives [[1,2,3,4],[2,3,4,1],[3,4,1,2],[4,1,2,3]]
Как я понимаю, converge
применяет две функции ветвления к v
, а затем передает результаты в качестве аргументов map
.Это правильно?Так почему же rotations(v)
не возвращает то же самое?
Код
Более краткая версия с использованием reduce
Вдохновленный вашими версиями в vanilla JS , я придумал следующую reduceRotations
функцию, которая не использует параметр индекса map
или рекурсию очевидным образом.Затем, конечно, я перевел это в vanilla Ramda , совершенно без очков.:)
const {converge,reduce,always,append,pipe,last,head,tail,identity,unapply} = require("ramda");
const reduceRotations = (v) => {
const rotate = (v) => append(head(v),tail(v));
return reduce(
(acc,_) => append(rotate(last(acc)),acc),
[v],
tail(v)
);
};
const pointFreeRotations =
converge(reduce,[
always(converge(append,[
pipe(last,converge(append,[head,tail])),
identity
])),
unapply(identity),
tail
]);
Код
Еще один
В следующих эквивалентных функциях вместо * используется scan
1045 *.
const {converge,scan,always,append,head,tail,identity} = require("ramda");
const scanRotations = (v) => {
const rotate = (v) => append(head(v),tail(v));
return scan(rotate,v,tail(v));
};
const scanPointFreeRotations =
converge(scan,[
always(converge(append,[head,tail])),
identity,
tail
]);
Код