所以我开始关注Ramda/Folktale.我在尝试映射来自目录的任务数组时遇到问题.我正在尝试解析文件内容.
var fs = require('fs');
var util = require('util');
var R = require('ramda');
var Task = require('data.task');
var compose = R.compose;
var map = R.map;
var chain = R.chain;
function parseFile(data) {
console.log("Name: " + data.match(/\$name:(.*)/)[1]);
console.log("Description: " + data.match(/\$description:(.*)/)[1]);
console.log("Example path: " + data.match(/\$example:(.*)/)[1]);
}
// String => Task [String]
function readDirectories(path) {
return new Task(function(reject, resolve) {
fs.readdir(path, function(err, files) {
err ? reject(err) : resolve(files);
})
})
}
// String => Task String
function readFile(file) {
return …Run Code Online (Sandbox Code Playgroud) javascript functional-programming ramda.js folktale fantasyland
我正在研究有关函数式编程的教程,该教程使用sanctuary.js库显示以下代码示例:
var S = require('sanctuary')
var Maybe = S.Maybe
S.add(
Maybe.of(3)
,Maybe.of(5)
)
.map(n => n * n)
Run Code Online (Sandbox Code Playgroud)
我得到了错误Maybe.of is not a function。sanctuary.js API文档显示了一个使用.ofas 的示例S.of(S.Maybe, 42),因此我修改了我的代码,如下所示:
...
S.of(S.Maybe, 3)
,S.of(S.Maybe, 5)
Run Code Online (Sandbox Code Playgroud)
我得到错误:
add :: FiniteNumber -> FiniteNumber -> FiniteNumber
^^^^^^^^^^^^
1
The value at position 1 is not a member of ‘FiniteNumber’.
Run Code Online (Sandbox Code Playgroud)
我没有在庇护所网站上看到有关FiniteNumber类型类的任何文档。如何使此代码起作用?并且有什么方法可以将保护区.of构造函数链接到类型类上,因此教程站点上的示例可以正常工作吗?
最近我决定从 lodash 切换到 ramda,以使用功能方式来编写我的逻辑。我喜欢它!在对 FP 进行了一些广泛的挖掘之后,我发现它不仅与方便的纯/无点实用程序 (ramda) 有关,而且更多地与复杂的(至少对我而言)数学抽象(fantasy-land)有关。我没有全部了解,但Either 和Task 模式看起来非常方便。问题是我不确定如何将它与 ramda 实用程序合并。我知道 ramda-fantasy,但它不再维护。Ramda-fantasy 建议的库与 ramda-fantasy 的工作方式不同。有了关于 Monads/Monoids/Functors 类型的所有这些新信息,我完全迷失了。
例如,这个约定是什么?
Right('boo')
.map(x => x + '!')
.map(x => x.toUpperCase())
vs
R.pipe(
R.map(x => x + '!')
R.map(x => x.toUpperCase())
)(Right('boo'))
Run Code Online (Sandbox Code Playgroud)
如果我决定一直切换到 Monads,我是否不需要 ramda?
javascript functional-programming ramda.js fantasyland ramda-fantasy
我正在尝试使用 IO 和 Maybe monads编写一个简单的示例。该程序从 DOM 中读取一个节点并写入一些内容innerHTML其中写入一些内容。
我所关注的是 IO 和 Maybe 的组合,例如IO (Maybe NodeList)。
如何使用此设置短路或引发错误?
我可以用来getOrElse提取值或设置默认值,但将默认值设置为空数组没有任何帮助。
import R from 'ramda';
import { IO, Maybe } from 'ramda-fantasy';
const Just = Maybe.Just;
const Nothing = Maybe.Nothing;
// $ :: String -> Maybe NodeList
const $ = (selector) => {
const res = document.querySelectorAll(selector);
return res.length ? Just(res) : Nothing();
}
// getOrElse :: Monad m => m a -> a -> m a
var …Run Code Online (Sandbox Code Playgroud) javascript monads functional-programming ramda.js fantasyland
据我了解,类型类不是具体的东西,而只是临时和参数多态性的构造。Eq和Semigroup是类型类的示例。另一方面,代数数据类型是一种具体的复合类型,例如Either和Maybe。他们也是函子。
因此,JavaScript 有一个代数数据类型规范: https: //github.com/fantasyland/fantasy-land。在本页中,Setoid (Eq)、Ord和Semigroup也是 ADT。但这是正确的吗?如果是这样,它们由什么类型组成?
我还找到了这篇关于类型类的文章,这里 Functor 和 Monad 是类型类。https://typelevel.org/cats/typeclasses.html#type-classes-in-cats。而且,这是否意味着Either和Maybe也是类型类?
Eq是类型类还是代数数据类型?或两者?函子也一样
假设我有一堆函数返回Just或Nothing值,我想将它们链接在一起;
var a = M.Just("5").map(function(data){
return 1;
}).chain(function(data){
/*Make some operation return Just or Nothing */
console.log(data);
return M.Just(2);
}).chain(function(data){
/*Make some operation return Just or Nothing */
console.log(data);
return M.Nothing("Reason 1");
}).chain(function(data){
/*Make some operation return Just or Nothing */
console.log(data);
return M.Nothing("Reason 2");
}).getOrElse(function(data){
console.log(data);
return "Message";
});
console.log(a());
Run Code Online (Sandbox Code Playgroud)
输出:
> 1
> 2
> undefined
> Message
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,因为它在函数返回M.Nothing("Reason 1")的步骤失败,所以它没有通过我预期的其他函数.我相信Nothing没有有效的构造函数来获取参数.有没有办法在执行结束时获取此失败消息?我在民间故事中也试过这个,它与梦幻土地规格有关吗?
谢谢
javascript functional-programming ramda.js fantasyland ramda-fantasy
我是函数式编程的学生,对不起,如果我的问题听起来很奇怪 - 我试图围绕函数的给定类型签名以及如何实现它们.
看签名ap(换人)
https://gist.github.com/Avaq/1f0636ec5c8d6aed2e45
(a ? b ? c) ? (a ? b) ? a ? c
在这里给出
const S = f => g => x => f(x)(g(x));
我认为我理解.f是采用两个参数,功能a和b返回c.g是一个获取a和返回的函数b.所以g(a)返回b,因此f(a)(b)可以写为f(a)(g(a)),返回c.
g(a)是替代b?
好的,现在我正在寻找一个仍然有意义的不同实现:
https://github.com/sanctuary-js/sanctuary-type-classes/tree/v7.1.1#ap--applyf--fa-bfa---fb
ap(Identity(Math.sqrt), Identity(64))
类型签名
(f (a -> b), f a) -> f b看起来很像
(a ? b ? c) …functional-programming category-theory ramda.js fantasyland sanctuary
假设您有以下代码:
import R from "ramda";
import S from "sanctuary";
import { Left, Right } from "sanctuary-either";
const add = R.curry((p1, p2) => p1 + p2);
const addOne = add(1);
const func1 = () => Right(2);
const func2 = () => Right(7);
Run Code Online (Sandbox Code Playgroud)
addOne与func1or结合起来func2相对容易:
const res = R.compose(
S.map(addOne),
func1
)();
Run Code Online (Sandbox Code Playgroud)
但是如何add使用func1andfunc2作为参数进行调用呢?
ps 我知道 ramda 提供了一个add函数。将该示例视为现实世界问题的抽象。
javascript functional-programming ramda.js fantasyland sanctuary
fantasyland ×8
javascript ×6
ramda.js ×6
sanctuary ×3
folktale ×1
haskell ×1
monads ×1
scala ×1