Стиль pointfree для условной функции

Я хотел бы получить некоторую помощь в написании этого в стиле pointfree.

Для контекста: функция принимает массив типов Either и возвращает тип Task. Тип задачи отклоняется с любым из типов Either, для которых задан левый набор. Тип задачи разрешается, если нет ни одного из типов с левым набором. Это используется следующим образом:

    Async.parallel(xs).             
        map(eachToEither).          
        chain(rejectAnyLefts).      
        fork(error, success)

Где на практике я бы добавил еще одну цепочку (непосредственно перед развилкой) для выполнения perist. Но сначала я хочу убедиться, что мой код настолько идиматичен, насколько это возможно. Функция под рукой - это rejectAnyLefts, которую я хотел бы написать pointfree, но есть пара вещей, которые бросают меня в цикл.

  1. если
  2. необходимость хранения значения leftObjs для использования в IF и, возможно, возвращаемого значения
const rejectAnyLefts = function(eitherArray){
    const leftObjs = r.filter(r.propEq("isLeft", true), eitherArray)

    const isEmpty = r.propEq('length', 0)
    return (isEmpty(leftObjs)) ?
        Task.rejected(leftObjs) :
        Task.of(eitherArray)
}

1 ответ

Решение

Если бы вы были заинтересованы только в захвате первого Left значение, то это может быть определено с помощью R.sequence который преобразует [Either a b] в Either a [b],

R.pipe(R.sequence(Either.of), R.invoker(2, 'fold', Task.rejected, Task.of));

Validation тип может быть использован вместо Either который вместо этого объединит все Failure значения, однако это потребует значения в вашем Failure типы для реализации Semigroup чтобы позволить им быть объединенными.

Чтобы захватить и отклонить все Left значения, мы можем смоделировать вашу существующую реализацию в форме без точек, таких как:

R.pipe(R.partition(R.prop('isLeft')),
       R.ifElse(R.pipe(R.head, R.isEmpty),
                R.pipe(R.last, Task.of),
                R.pipe(R.head, Task.rejected)));

Будет ли это более или менее читабельным, чем ваша существующая реализация, в значительной степени субъективно.

Другие вопросы по тегам