#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 ошибается или немного устарела.