我希望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) 我正在研究有关函数式编程的教程,该教程使用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构造函数链接到类型类上,因此教程站点上的示例可以正常工作吗?
我是函数式编程的学生,对不起,如果我的问题听起来很奇怪 - 我试图围绕函数的给定类型签名以及如何实现它们.
看签名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
我离开了弗里斯比教授的"功能编程指南",似乎是对"可能"的错误概念.
我相信:
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) 我有一个这样的管道:
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在这个管道中间使用?
假设您有以下代码:
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
我有一个这样的管子
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)
我怎样才能做到这一点?
我正在处理Sanctuary.js上的文档.我一直在努力学习Haskell,并且在FP概念上有点挣扎.
我理解类型值是一个对象,它具有(a)构造函数(代表类型),(b)类型标识符(作为命名属性的类型名称@@type,以及(c)需要由除了没有任何状态的类型值之外,FP类型值和普通的面向对象对象之间有什么区别?Fantasy-Land规范给出了标准类型来实现,包括它们的方法.一些(全部?)的这些方法遵守代数法则,比如Functors要求一种map遵循身份和组成规律的方法.我可以自由地创建我的用户类型并需要我喜欢的方法吗?这些方法是否必须符合任何代数设计原则或法则?不,它确实看起来像OO设计(减去对象中的状态)给我!我不知道我缺少什么.类似接口吗?父对象?
该保护区的文档支持属性访问值的类型,或只是每个值-关于"通达假"的谈判null和undefined.它表示" Object接近,但Object.create(null)产生一个支持属性访问的值,但它不是Object类型的成员".但是,打印具有创建的对象null显示{},它的typeof存在object.它对我来说似乎是Object类型的成员.我有什么误会?为什么Accessiblepsuedo类型是必要的?伪类型和常规类型有什么区别?Integer例如,被称为伪类,但它似乎是Number我的类的扩展.
sanctuary ×8
javascript ×6
fantasyland ×3
fluture ×2
ramda.js ×2
elm ×1
haskell ×1
immutable.js ×1
maybe ×1
monads ×1