在不分叉的情况下将路径列表转换为任务列表
Turning a list of paths into a list of Tasks without forking it
仍在学习 FP,但我觉得我终于开始了解 monad,特别是如何使用它们。所以这就是我所拥有的:
/* taken from
https://mostly-adequate.gitbooks.io/mostly-adequate-guide/content/ch08.html#asynchronous-tasks
*/
import fs from 'fs'
import { Task, } from './shared/functional.js';
// readDir :: String -> Task Error (Array String)
const readDir = path => new Task((reject, result) => {
fs.readdir(path, (err, data) => (err ? reject(err) : result(data)));
});
const readStat = filename => new Task((reject, result) => {
fs.stat(filename, (err, data) => (err ? reject(err) : result(data)));
});
console.log(readDir('./shared'))
readDir('./shared').fork(console.error,console.log)
使用上面的代码,我可以获取该特定目录中的一组内容。
我有两个问题:
如何在不像下面那样显式组合目录的情况下连接目录。这样我就可以避免调用 './shared' 两次。
const dirList = compose(
chain(map(concat('./shared/')))),
readDir,
);
其次,是否可以映射字符串数组,然后在不分叉外部任务的情况下转入任务数组?我想获取数组中每个项目的统计信息。
它不需要是一系列任务,但我想避免将它分叉两次。我想调用 readDir,无论结果如何,我都可能得到结果的统计信息,它可以是 ex 的一组统计信息。而不是我需要将其转换为任务的字符串数组。
我得到的最远的是:
const dirList = compose(
map(map(compose(readStat, concat('./shared/')))),
readDir,
);
有什么想法吗?
谢谢大家
我想你正在寻找
// readDir :: String -> Task Error (List String)
const readDir = path => new Task((reject, result) => {
fs.readdir(path, (err, data) => (err ? reject(err) : result(new List(data))));
});
// readStat :: String -> Task Error Stats
const readStat = filepath => new Task((reject, result) => {
fs.stat(filepath, (err, data) => (err ? reject(err) : result(data)));
});
// dirList :: String -> Task Error (List Stats)
const dirList = dir => chain(
traverse(Task.of, compose(readStat, concat(dir))),
readDir(dir),
);
dirList('./shared/').fork(console.log, console.error);
@Bergi,
为了更清楚地说明,下面的示例之所以有效,是因为我们得到了一个可遍历的 Maybe。
const readFirst = path => compose(
chain(traverse(Task.of, compose(readStat,concat(path)))),
map(safeHead),
compose(readDir, ()=>path),
);
const stats = maybe('nope', console.log)
readFirst('./shared/')().fork(console.error, stats)
在您的评论中,您试图遍历一个数组,该数组未实现该方法。我需要一种使数组可遍历的方法,然后我想我可以将执行捆绑在一起,并且 return 分叉任务时的统计列表。
仍在学习 FP,但我觉得我终于开始了解 monad,特别是如何使用它们。所以这就是我所拥有的:
/* taken from
https://mostly-adequate.gitbooks.io/mostly-adequate-guide/content/ch08.html#asynchronous-tasks
*/
import fs from 'fs'
import { Task, } from './shared/functional.js';
// readDir :: String -> Task Error (Array String)
const readDir = path => new Task((reject, result) => {
fs.readdir(path, (err, data) => (err ? reject(err) : result(data)));
});
const readStat = filename => new Task((reject, result) => {
fs.stat(filename, (err, data) => (err ? reject(err) : result(data)));
});
console.log(readDir('./shared'))
readDir('./shared').fork(console.error,console.log)
使用上面的代码,我可以获取该特定目录中的一组内容。 我有两个问题:
如何在不像下面那样显式组合目录的情况下连接目录。这样我就可以避免调用 './shared' 两次。
const dirList = compose(
chain(map(concat('./shared/')))),
readDir,
);
其次,是否可以映射字符串数组,然后在不分叉外部任务的情况下转入任务数组?我想获取数组中每个项目的统计信息。 它不需要是一系列任务,但我想避免将它分叉两次。我想调用 readDir,无论结果如何,我都可能得到结果的统计信息,它可以是 ex 的一组统计信息。而不是我需要将其转换为任务的字符串数组。
我得到的最远的是:
const dirList = compose(
map(map(compose(readStat, concat('./shared/')))),
readDir,
);
有什么想法吗?
谢谢大家
我想你正在寻找
// readDir :: String -> Task Error (List String)
const readDir = path => new Task((reject, result) => {
fs.readdir(path, (err, data) => (err ? reject(err) : result(new List(data))));
});
// readStat :: String -> Task Error Stats
const readStat = filepath => new Task((reject, result) => {
fs.stat(filepath, (err, data) => (err ? reject(err) : result(data)));
});
// dirList :: String -> Task Error (List Stats)
const dirList = dir => chain(
traverse(Task.of, compose(readStat, concat(dir))),
readDir(dir),
);
dirList('./shared/').fork(console.log, console.error);
@Bergi,
为了更清楚地说明,下面的示例之所以有效,是因为我们得到了一个可遍历的 Maybe。
const readFirst = path => compose(
chain(traverse(Task.of, compose(readStat,concat(path)))),
map(safeHead),
compose(readDir, ()=>path),
);
const stats = maybe('nope', console.log)
readFirst('./shared/')().fork(console.error, stats)
在您的评论中,您试图遍历一个数组,该数组未实现该方法。我需要一种使数组可遍历的方法,然后我想我可以将执行捆绑在一起,并且 return 分叉任务时的统计列表。