- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
试图弄清楚 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!
最佳答案
您离解决方案不远了。
为了避免第二次调用 runIO
,您可以利用 Ramda Fantasy 中的 IO
类型实现 fantasyland 规范中的 Apply
接口(interface)这一事实。这允许您提升一个函数(例如您的 renameDirect
)以接受 IO
类型的参数并将该函数应用于包含在 IO
中的值> 实例。
我们可以在这里使用 R.ap
,它具有 IO (a -> b) -> IO a -> IO -> b< 的签名(专门用于
。这个签名表明,如果我们有一个 IO
)/IO
实例,它包含一个接受某种类型 a
并返回某种类型 b
的函数,以及另一个 IO
包含某种类型 a
的实例,我们可以生成包含某种类型 b
的 IO
实例。
在开始之前,我们可以对您对 R.zip
和 R.apply(renameDirect)
的使用稍作更改,方法是使用 R.zipWith(renameDirect)
将两者结合起来。
现在你的例子看起来像:
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 renameDirect = (file, name) => console.log('Renaming file ' + file + ' to ' + name + '\n')
const filesIO = R.map(R.split('\n'), safeReadFileSync('filenames.txt'))
const testfilesDirIO = safeReadDirSync('./testfiles/')
const renameDirectIO = (files, names) =>
R.ap(R.map(R.zipWith(renameDirect), files), names)
renameDirectIO(testfilesDirIO, filesIO).runIO()
在此示例中,我们通过调用 R.map(R.zipWith(renameDirect), files)
创建了一个 IO (a -> b)
实例这将部分应用 R.zipWith(renameDirect)
以及存储在 files
中的值。然后将其与 names
值一起提供给 R.ap
,这将生成一个新的 IO
实例,其中包含等效于以下内容的有效结果IO(() => R.zipWith(renameDirect, value.runIO(), names.runIO())
现在因为必须调用 R.map
来部分应用 R.ap
的第一个参数往往有点笨拙,所以还有另一个辅助函数 R.lift
可用于此目的,它负责提升给定函数的工作以生成现在接受 Apply
实例的新函数。
所以在上面的例子中:
const renameDirectIO = (files, names) =>
R.ap(R.map(R.zipWith(renameDirect), files), names)
可以简化为:
const renameDirectIO = R.lift(R.zipWith(renameDirect))
关于node.js - 带有 ramda 和 ramda-fantasy 的 Monadic IO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39885055/
fantasy-land/id :: Category c => () -> c a a 我不太明白这个签名说的是什么? id 是一种采用零参数并返回类别和其他两个内容的方法。 这样对吗?这有什么意义
我正在制作一个 C++ 程序来模拟梦幻足球选秀。我使用链表为参加选秀的每个人创建了一个球队名称列表。现在,我想知道我应该以何种方式将球员加入他们各自的球队。我有一个读入文件中的足球运动员,可以弄清楚如
在这个场景中,我有:球员、梦幻足球联赛(社区)和结果。 1 个用户可以加入多个梦幻联盟。 我的当前结构是: create table players (id int, email, display_n
我正处于摆弄 Yahoo 的 Fantasy Sports API 的初始阶段,如此处所述。 https://developer.yahoo.com/fantasysports/guide/然而,从字
https://developer.yahoo.com/fantasysports/guide/game-resource.html 所以在 API 指南上,在 stat_categories 下,有
为了好玩,我正在尝试从我的 Yahoo fantasy Football League 上抓取一些数据以进行球员交易。这是我第一次使用 mechanize 和 beautifulsoup 运行,我在打
我在访问 Yahoo Fantasy API 时遇到了一个奇怪的问题。我已经一切正常了。身份验证等。我可以进行API调用并获取数据。然而有时,似乎完全随机,我收到一个错误: { statusCod
Google-chrome 以粗体呈现 font family(type) fantasy。见http://jsfiddle.net/Q7mQD/图片 http://imageshack.us/pho
我正在尝试构建一个从 Yahoo 的 API 获取梦幻体育信息的网络应用程序。我知道它需要使用 OAuth 才能与 API 对话。它是使用 Flask 创建的,将在 Google App Engine
我想构建一个应用程序来查询我的 Yahoo! 中的数据。 Fantasy league 但无法通过 3-legged OAuth 身份验证,希望有人能给我一个快速演示,或者给我指点相关教程。 我愿意使
我有一个与 espn Fantasy Football 相关的宠物项目。我的联盟是私有(private)的,它要求我登录该网站才能导航到该页面。例如,当我转到 时在浏览器上 http://games.
我引用的是@chriddyp 在此处发布的示例代码片段 https://community.plot.ly/t/dash-datatable-updating-rows-with-dropdowns/
我想玩转 Yahoo Fantasy Sports API。我不知道从哪里开始。我需要做什么才能开始在 IRB 中使用 API 并开始调用和检索不同的玩家或统计数据?这是我第一次尝试处理没有现成的 R
试图弄清楚 IO monad 是如何工作的。 使用下面的代码,我读取了 filenames.txt 并使用结果重命名目录 testfiles 中的文件。这显然是未完成的,所以我没有实际重命名我登录到控
我是一名优秀的程序员,十分优秀!