2015-12-20 6 views
1

Я хотел бы помочь в написании этого в стиле pointfree.pointfree style для условной функции

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

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.commute, который преобразует [Either a b] в Either a [b].

R.pipe(R.commute(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))); 

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

+0

Ahhh - Я рассматривал функцию перегородки, но не мог думать о остатке кода (еще новичок в rmada). Я рассматривал что-то вроде IF в excel - это именно то, что есть. Мысленно я был не слишком далеко, спасибо за помощь. Subjectivley Я не думаю, что это более читаемо, чем «заостренная» реализация. Но для меня это был скорее академический вопрос, и я чувствую, что мое понимание было продвинуто вперед, – akaphenom