标签: sanctuary

Immutable.js数据结构的自定义相等语义

我希望Sanctuary能够提供与Fantasy Land兼容的Map和Set类型以及基于值的等式语义.理想情况下,这些值是不可变的,尽管这并不重要,因为Sanctuary将提供用于合并和操纵这些值的纯函数.

我很乐意利用Immutable.js团队所做的出色工作; 我想实现持久数据结构需要相当大的努力!

由于Sanctuary会公开与这些值交互的函数,因此Immutable.js提供的API并不重要.但是,这些类型的等同语义至关重要.

这对我的用例来说是不可接受的:

> Map([[[1, 2, 3], 'foo'], [[1, 2, 3], 'bar']])
Map { [1,2,3]: "foo", [1,2,3]: "bar" }
Run Code Online (Sandbox Code Playgroud)

[1, 2, 3]是一样的价值[1, 2, 3].不应该有两个具有相同键的映射条目.

处理-0也存在问题:

> Immutable.is(Map([[0, 0]]), Map([[-0, -0]]))
true
Run Code Online (Sandbox Code Playgroud)

我意识到可以通过定义equals方法来定义自己类型的相等语义,但我希望重新定义本机类型(如Array和Number)的相等语义.这可能吗?相关文件似乎是is.js,但我看不到自定义的钩子.

Sanctuary的Map类型可能会包装Immutable.js Map类型.这将提供:

  • 一种处理方式-0;
  • 在执行assoc通常会导致重复键的操作之前执行基于值的相等性检查的机会; 和
  • 一个定义各种fantasy-land/方法的地方.

也许:

Map k v = { negativeZero :: Maybe v
          , value :: ImmutableMap k v …
Run Code Online (Sandbox Code Playgroud)

javascript functional-programming immutable.js sanctuary

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

在庇护所上使用`.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
查看次数

理解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
查看次数

我该如何映射Maybe List?

我离开了弗里斯比教授的"功能编程指南",似乎是对"可能"的错误概念.

我相信:

map(add1, Just [1, 2, 3])
// => Just [2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

我对上述指南的感觉是Maybe.map应该尝试调用Array.map数组,基本上是返回Just(map(add1, [1, 2, 3]).

当我尝试使用Sanctuary的Maybe类型,以及最近Elm的Maybe类型时,我很失望地发现他们都不支持这个(或者,也许,我不明白他们是如何支持的).

在保护区,

> S.map(S.add(1), S.Just([1, 2, 3]))
! Invalid value

add :: FiniteNumber -> FiniteNumber -> FiniteNumber
                       ^^^^^^^^^^^^
                            1

1)  [1, 2, 3] :: Array Number, Array FiniteNumber, Array NonZeroFiniteNumber, Array Integer, Array ValidNumber

The value at position 1 is not a member of ‘FiniteNumber’.
Run Code Online (Sandbox Code Playgroud)

在榆树,

> Maybe.map sqrt (Just [1, …
Run Code Online (Sandbox Code Playgroud)

monads functional-programming maybe elm sanctuary

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

在 Sanctuary 管道中间执行 Fluture 任务

我有一个这样的管道:

S.pipe([
    getRequestFile,                  // not async
    S.chain(saveTemporary),          // not async
    S.chain(copyImageToPublicPath),  // async
    S.chain(copyFileToPath),         // async
    S.chain(someLoggingFunction),    // not async
    S.chain(sendResponse),           // not async
]);
Run Code Online (Sandbox Code Playgroud)

在这个管道中间有 2 个异步函数。我要awaitforcopyImageToPublicPath然后awaitforcopyFileToPath然后继续正常流程

经过一番搜索,我发现有Future.tryP功能可以做,async但是我如何Fluture在这个管道中间使用?

javascript functional-programming sanctuary fluture

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

对两个 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
查看次数

使用 Sancuary 执行 Fluture 任务

我有一个这样的管子

const asyncFn = (x) => {
    return Future.tryP(() => Promise.resolve(x + ' str2'))
};

const pipeResult = S.pipe([
    x => S.Right(x + " str1"), // some validation function
    S.map(asyncFn),
])("X");

pipeResult.fork(console.error, console.log);
Run Code Online (Sandbox Code Playgroud)

我想在asyncFn. 问题是当我有Right输入时,我可以再分叉它。

当我登录时,pipeResult我看到:

Right (tryP(() => Promise.resolve(x + ' str2')))
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

javascript functional-programming sanctuary fluture

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

在Sanctuary.js(Fantasy Land)中键入值和"可访问的假型"

我正在处理Sanctuary.js上的文档.我一直在努力学习Haskell,并且在FP概念上有点挣扎.

  1. 我理解类型值是一个对象,它具有(a)构造函数(代表类型),(b)类型标识符(作为命名属性的类型名称@@type,以及(c)需要由除了没有任何状态的类型值之外,FP类型值和普通的面向对象对象之间有什么区别?Fantasy-Land规范给出了标准类型来实现,包括它们的方法.一些(全部?)的这些方法遵守代数法则,比如Functors要求一种map遵循身份和组成规律的方法.我可以自由地创建我的用户类型并需要我喜欢的方法吗?这些方法是否必须符合任何代数设计原则或法则?不,它确实看起来像OO设计(减去对象中的状态)给我!我不知道我缺少什么.类似接口吗?父对象?

  2. 保护区的文档支持属性访问值的类型,或只是每个值-关于"通达假"的谈判nullundefined.它表示" Object接近,但Object.create(null)产生一个支持属性访问的值,但它不是Object类型的成员".但是,打印具有创建的对象null显示{},它的typeof存在object.它对我来说似乎是Object类型的成员.我有什么误会?为什么Accessiblepsuedo类型是必要的?伪类型和常规类型有什么区别?Integer例如,被称为伪类,但它似乎是Number我的类的扩展.

javascript haskell functional-programming sanctuary

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