Избегайте дублирования аргументов в rambda

#javascript #rambda.js

Вопрос:

 import { pipe } from 'rambda';
function readFile(filePath) { // reading the file return fileContents }
function editFile(fileContents) { // edit the file return newFileContents }
function writeFile(fileContents, filePath) { // write content  }

function manipulateFile(filePath) {
  return writeFile(pipe(readFile, editFile)(filePath))(filePath);
}
 

есть ли какой-либо способ избежать filePath дублирования аргументов в manipulateFile ?

В идеале я хотел бы сделать это вот так. Но filePath не будет предоставлено writeFile

 function manipulateFile(filePath) {
  return pipe(
    readFile,
    editFile,
    writeFile
  )(filePath)
}
 

Ответ №1:

Вы можете использовать chain комбинатор для передачи одного и того же аргумента нескольким вызовам вложенных функций.

Вот выдержка из общих комбинаторов в JavaScript:

 const S_ = f => g => x => f (g (x)) (x)
 

[…]

Имя # Хаскелл Рамда Святилище Подпись
цепь S_ (=<<) chain chain (a → b → c) → (b → a) → b → c

Чтобы сделать более очевидным, насколько это уместно здесь, подумайте об этом — ваш manipulateFile можно переписать как:

 function manipulateFile(filePath) {
  const f = writeFile;
  const g = pipe(readFile, editFile);
  const x = filePath;

  return f (g (x)) (x);
}
 

Который точно соответствует S_ телу и, таким образом, может быть представлен как S_(f)(g)(x) .

Используя Рамбду chain , вы можете использовать:

 import { pipe, chain } from 'ramda';
function readFile(filePath) { // reading the file return fileContents }
function editFile(fileContents) { // edit the file return newFileContents }
function writeFile(fileContents, filePath) { // write content  }

function manipulateFile(filePath) {
  return chain(writeFile, pipe(readFile, editFile))(filePath);
}
 

или уменьшите его до точечного:

 const manipulateFile = chain(writeFile, pipe(readFile, editFile));
 

Похоже, что Рамбда chain работает не так, как Рамда.

Комментарии:

1. Получил TypeError: list.map is not a function

2. О, я понимаю. Похоже, что chain находящийся в оперативной памяти(b)da не полностью равен цепному комбинатору. Дай мне немного времени, чтобы провести еще кое-какие исследования.

3. Не бери в голову, просто установил рамду. Спасибо!

4. Отлично! Рад, что это работает. Возможно, в данном случае Rambda ошибается или немного устарела.