试图弄清楚 IO monad 是如何工作的。
使用下面的代码,我阅读filenames.txt
并使用结果重命名目录中的文件testfiles
。这显然还没有完成,所以我没有真正重命名我登录到控制台的任何内容。:)
我的问题是:
- 我打
runIO
了两次,但感觉应该只打一次,到底? - 我想使用
renameIO
而不是renaneDirect
但找不到正确的语法。
任何其他建议也很感激,我是 FP 的新手!
var R = require('ramda');
var IO = require('ramda-fantasy').IO
var fs = require('fs');
const safeReadDirSync = dir => IO(() => fs.readdirSync(dir));
const safeReadFileSync = file => IO(() => fs.readFileSync(file, 'utf-8'));
const renameIO = (file, name) => IO(() => console.log('Renaming file ' + file + ' to ' + name + '\n'));
const renameDirect = (file, name) => console.log('Renaming file ' + file + ' to ' + name + '\n');
safeReadFileSync("filenames.txt") // read future file names from text file
.map(R.split('\n')) // split into array
.map(R.zip(safeReadDirSync('./testfiles/').runIO())) // zip with current file names from dir
.map(R.map(R.apply(renameDirect))) // rename
.runIO(); // go!