标签: fantasyland

在Javascript中映射任务数组

所以我开始关注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

9
推荐指数
1
解决办法
1307
查看次数

在庇护所上使用`.of`构造函数

我正在研究有关函数式编程的教程,该教程使用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构造函数链接到类型类上,因此教程站点上的示例可以正常工作吗?

javascript functional-programming fantasyland sanctuary

5
推荐指数
1
解决办法
423
查看次数

Ramda 与 FP 类型

最近我决定从 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

5
推荐指数
1
解决办法
76
查看次数

结合 Maybe 和 IO monad 进行 DOM 读/写

我正在尝试使用 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

5
推荐指数
1
解决办法
1062
查看次数

类型类和代数数据类型之间的区别

据我了解,类型类不是具体的东西,而只是临时和参数多态性的构造。EqSemigroup是类型类的示例。另一方面,代数数据类型是一种具体的复合类型,例如EitherMaybe。他们也是函子

因此,JavaScript 有一个代数数据类型规范: https: //github.com/fantasyland/fantasy-land。在本页中,Setoid (Eq)、OrdSemigroup也是 ADT。但这是正确的吗?如果是这样,它们由什么类型组成?

我还找到了这篇关于类型类的文章,这里 Functor 和 Monad 是类型类。https://typelevel.org/cats/typeclasses.html#type-classes-in-cats。而且,这是否意味着EitherMaybe也是类型类?

Eq是类型还是代数数据类型?或两者?函子也一样

haskell functional-programming scala fantasyland

4
推荐指数
1
解决办法
525
查看次数

Ramda通过链调用传递"可能"错误消息

假设我有一堆函数返回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

2
推荐指数
1
解决办法
242
查看次数

理解Substitution /`ap`类型签名和不同实现(函数式编程)的困惑

我是函数式编程的学生,对不起,如果我的问题听起来很奇怪 - 我试图围绕函数的给定类型签名以及如何实现它们.

看签名ap(换人)

https://gist.github.com/Avaq/1f0636ec5c8d6aed2e45

(a ? b ? c) ? (a ? b) ? a ? c

在这里给出

const S = f => g => x => f(x)(g(x));

我认为我理解.f是采用两个参数,功能ab返回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))

类型签名

  1. (f (a -> b), f a) -> f b

看起来很像

  1. (a ? b ? c) …

functional-programming category-theory ramda.js fantasyland sanctuary

2
推荐指数
1
解决办法
321
查看次数

对两个 Either 进行操作

假设您有以下代码:

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)

addOnefunc1or结合起来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

1
推荐指数
1
解决办法
130
查看次数