问题标签 [fantasyland]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - 在 Javascript 中映射一组任务
所以我开始研究 Ramda / Folktale。我在尝试映射来自目录的一组任务时遇到问题。我正在尝试解析文件内容。
我正在读取目录中的文件并返回一个任务。当这个问题解决时,它应该进入 readFile 函数(它返回一个新任务)。一旦它读取文件,我希望它只解析其中的一些位。
具有以下内容:
它进入了 readFile 函数,但 'file' 是一个文件数组,所以它会出错。
和:
我们从来没有进入 fs.readfile(),但 'file' 是实际的文件名。
我对此感到非常困惑,文档令人困惑。欢迎任何建议。
谢谢
javascript - 在 javascript(DynamoDB 和 Facebook API)中使用 Task monads 和 Reader monads
在这里,我们尝试使用 javascript 以功能方式进行大量调用,问题是我们最终得到 Reader.of(Task.of(Reader.of(Task.of))),所以我们需要映射(map(map(map))) 我们需要操作的值。
计算需要转到 DynamoDB 表,获取特定属性,然后再次转到 DynamoDB 并获取另一个属性,然后转到 facebook api 获取集合,最后将该信息存储在 Dynamo 中的表中。因此,每个调用都使用 AWS javascript 插件和 node.js 中的 facebook Graph 插件。所以我们需要在运行时传递 AWS 依赖,然后我们需要分叉,然后再次传递 AWS 并再次分叉,然后在运行时传递 FBGraph 并再次分叉,如果您正在构建计算,这有点乏味。
无论如何这里是代码:
目标是只将 AWS 插件和 FBGraph 插件传递给计算一次,构建一个优雅的组合,如:
const computation = compose(saveIntoDynamo3, fetchFromFacebook,fetchFromDynamo2,fetchFromDynamo)
接着:
computation().run({aws: AWSService, FB: FBGraph})
javascript - 将包含单个数据数组的任务链接(或映射)到任务数组
学习 Fanatasy Land/Folk Tale 的一部分使我创建了一些代码。我基本上是在扫描我的网络(通过 someLib)并将结果上传到 mongo 存储库。扫描返回一系列结果,而 mongo 的 upsert 需要独立处理结果(猫鼬 - 这也是我第一次使用这个库,所以我可能会误会)。在传统的承诺基础模型中,我会
就其本身而言,这是一个非常干净的表示,但我想推动我对这些功能技术的理解。我的工作版本还有一些不足之处,因为我似乎无法从 someLibTask 函数返回的任务中得到,该函数包含一个对象数组到一个代表各个 upsert 的任务数组。我觉得这里必须有更好的方法是有效的:
理想情况下,我可以将 dataTask 中的结果链接(或映射)到持久化中,这会将单个任务转换为一组 upsert 任务。然后我可以等待。我很想看到类似的东西:
javascript - 为什么幻想大陆规范要求链必须返回相同链的值?
chain
方法具有 Chain 的值必须提供
chain
方法。chain 方法接受一个参数:
m.chain(f)
f
必须是返回值的函数
- 如果
f
不是函数,则 的行为chain
未指定。f
必须返回相同链的值chain
必须返回相同链的值
Given 是选项 monad 的简单实现:
为了保证chain
总是返回一个选项单子,我必须确保mf
(monadic function) 总是返回一个。这是不可能的,因为mf
它不是实现的一部分。相反,它是在使用 monad 时定义的:
在第二个方法应用程序中,传递的函数不返回单子,这导致单子计算的展开结果。我可以添加一个类型检查,chain
或者join
通过鸭子打字来解决这个问题——虽然这会很丑陋。
为什么规范在这一点上要求类型安全?Javascript 是动态类型的,我更愿意编写适当的单元测试,而不是在运行时执行类型检查。那我会违反规范吗?
typescript - 是否可以为特定方法约束泛型类?
假设我在 TypeScript 中创建了一个容器。它可以是任何容器,但我将使用以下简单示例:
假设我想提供一个功能,如果我有两个带有数字的容器,我可以轻松地创建一个将这些数字加在一起的新容器。
但是我不知道是否可以进行上述代码类型检查。问题是我所知道this.val
的只是它是类型T
(什么都不是)。我想以某种方式限制该add
方法,使其只能在Container<T>
where的实例上调用T == number
。这在 TypeScript 中可能吗?
以上只是一个人为的例子。我真正想做的是为应用函子创建一个 TypeScript 接口。一个应用函数有一个方法,Container
看起来像这样:
所以在这种情况下,我必须知道T == (a: A) => B
。更一般地说,我希望能够定义这个接口:
这有可能吗?
javascript - Ramda 通过链式调用传递“Maybe”错误消息
假设我有一堆函数返回 Just or Nothing 值,我想像这样将它们链接在一起;
输出:
在上面的代码中,因为它在函数返回 M.Nothing("Reason 1") 的步骤中失败了,所以它没有通过其他函数,这是我所期望的。我相信没有带参数的 Nothing 的有效构造函数。有没有办法在执行结束时得到这个失败消息?我在民间故事中也试过这个,它与幻想土地规格有关吗?
谢谢
javascript - 结合 Maybe 和 IO monad 进行 DOM 读/写
我正在尝试使用 IO 和 Maybe monads 编写一个简单的示例。程序从 DOM 中读取一个节点innerHTML
并向其写入一些内容。
我挂断的是 IO 和 Maybe 的组合,例如IO (Maybe NodeList)
.
如何使用此设置短路或引发错误?
我可以getOrElse
用来提取一个值或设置一个默认值,但是将默认值设置为一个空数组并没有任何帮助。
javascript - 通过使用带有folktale2的函数式编程javascript,如何优雅地访问先前任务的结果?
一个任务有几个步骤,如果每个步骤的输入只是直接来自最后一步,那很容易。然而,更多的时候,一些步骤不仅仅依赖于直接的最后一步。
我可以通过多种方式解决,但最终都会得到丑陋的嵌套代码,我希望任何人都可以帮助我找到更好的方法。
我创建了以下类似登录的示例来演示,该过程分为以下 3 个步骤:
- 获取数据库连接 (() -> 任务连接)
- 查找帐户(连接 -> 任务帐户)
- 创建令牌(连接 -> accountId -> 任务令牌)
#step3 不仅取决于步骤#2,还取决于步骤#1。
下面是使用folktale2的笑话单元测试
尝试#1 是对的,但我必须将非常早的步骤的输出传递到需要它的步骤,如果它跨越许多步骤,那很烦人。
尝试#2 也是正确的,但以嵌套代码告终。
我喜欢尝试#3,它使用一些变量来保存值,但不幸的是,它不起作用。
Update-1 我认为另一种方法可以将所有输出置于将通过的状态,但它可能非常相似的尝试#1
update-2
通过使用@Scott 的do
方法,我对以下方法非常满意。它又短又干净。
javascript - 使用序列为大于 1 的元数函数提供单子参数的正确方法吗?
请参阅以下代码片段:
fun4
需要 3 个参数,只有当它们都是正确的参数时,我才想给出它们。也就是说,sequence
将应用每个单子值,因此我将它们作为一个包含原始、、、返回值的单一权限。fun1
fun2
fun3
这是推荐的方法吗?
ramda.js - 使用 ramda `sequence` 遍历字典
如何使用 ramdasequence
遍历字典?
给定以下字典
我想产生遍历的结果
R.sequence
在空列表的列表中使用结果
如果我遍历列表而不是字典,它会产生正确的笛卡尔积,但结果(当然)是列表而不是字典。