问题标签 [sanctuary]
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 - Immutable.js 数据结构的自定义相等语义
我希望Sanctuary提供与Fantasy Land兼容的具有基于值的相等语义的 Map 和 Set 类型。理想情况下,这些值是不可变的,尽管这并不重要,因为 Sanctuary 将提供纯函数来合并和以其他方式操作这些值。
我很想利用Immutable.js团队所做的出色工作;我想实现持久数据结构需要相当大的努力!
Immutable.js 提供的 API 并不重要,因为 Sanctuary 会公开与这些值交互的函数。然而,这些类型的相等语义是至关重要的。
这对我的用例来说是不可接受的:
[1, 2, 3]
是相同的值[1, 2, 3]
。不可能有两个具有相同键的映射条目。
的处理-0
也有问题:
我意识到可以通过定义方法来定义自己类型的相等语义equals
,但我希望重新定义原生类型(例如 Array 和 Number)的相等语义。这可能吗?相关文件似乎是is.js,但我没有看到用于自定义的钩子。
Sanctuary 的 Map 类型可能会包装 Immutable.js 的 Map 类型。这将提供:
- 一种处理方式
-0
; assoc
在执行通常会导致重复键的操作之前执行基于值的相等检查的机会;和- 定义各种
fantasy-land/
方法的地方。
也许:
我想确保在创建上述包装器之前没有其他方法可以实现所需的相等语义。facebook/immutable-js#519并不乐观。
functional-programming - 我应该如何映射可能列表?
我从Frisby 教授的《函数式编程最充分指南》中走出来,似乎对 Maybe 有一种误解。
我相信:
我对上述指南的感觉是Maybe.map
应该尝试调用Array.map
数组,本质上是返回Just(map(add1, [1, 2, 3])
。
当我尝试使用Sanctuary的 Maybe 类型和最近Elm的 Maybe 类型时,我很失望地发现他们都不支持这个(或者,也许我不明白他们是如何支持这个的)。
在圣域,
在榆树,
同样,我觉得我应该能够将 aJust(Just(1))
视为 a Just(1)
。另一方面,我的直觉[[1]]
完全相反。显然,map(add1, [[1]])
应该返回[NaN]
而不是[[2]]
或任何其他东西。
在 Elm 中,我能够做到以下几点:
这是我想做的,但不是我想做的。
一张地图应该如何覆盖Maybe List?
javascript - Picking fields from object with certain RecordType with Sanctuary
I have an object with options that corresponds to the following record type:
And I want to create a function that picks options from such records like R.pick
from ramda library. But I want to type list fields for picking. That list can contain only fields that are valid for record of type PullOpts
.
Expected behavior for the function:
Summary:
How I can write type my function arguments correct (
<some_type_for_validate_options>
and<constructed_type_for_return>
)?How I can write body of the function using sanctuary function compositions?
Thanks for any help:)
javascript - 库里在 Sanctuary 和 Ramda 之间有何不同?
当使用 Sanctuary 而不是 Ramda 时,我被“教授的飞盘......”中的咖喱示例所困扰。我收到错误消息:“'curry2' 最多需要三个参数,但收到了五个参数。” 而与 Ramda 一起工作正常。我确定我做错了什么,但我无法弄清楚。
按照书中的例子:
我明白了
javascript - 我可以通过 Sanctuary 的对象属性“结束”吗
Ramda 是我的第一个函数式编程库,现在我将 Sanctuary 与 Ramda 进行比较。也许我的一些问题太愚蠢了,但我没有找到学习Sanctuary的最佳方法。
我的问题如下:如何map
在对象的嵌套属性中排列?
Ramda 代码:
Sanctuary有任务收费吗?
javascript - Sanctuary.js (Fantasy Land) 中的类型值和“可访问伪类型”
我正在阅读有关 Sanctuary.js 的文档。我也一直在努力学习 Haskell,并且在 FP 概念上有些挣扎。
我知道类型值是一个对象,它具有 (a) 构造函数(类型代表),(b) 类型标识符(类型的名称作为名为的属性
@@type
,以及 (c) 需要由类型。除了类型值没有任何状态之外,FP 类型值和普通的面向对象对象有什么区别?Fantasy-Land 规范给出了标准类型来实现,包括它们的方法。一些(全部?)这些方法遵循代数定律,例如Functors
要求map
遵循恒等律和组合律的方法。我可以自由地创建我的用户类型并要求他们使用我喜欢的方法吗?这些方法是否必须符合任何代数设计原则或法则?如果不是,那对我来说确实像是 OO 设计(减去对象中的状态)!我不知道我错过了什么。类型像接口吗?父对象?Sanctuary 文档讨论了“可访问的伪类型”——支持属性访问的值的类型,或除and
null
之外的所有值undefined
。它说“Object
很接近,但Object.create(null)
会产生一个支持属性访问但不是 Object 类型成员的值”。但是打印一个用null
显示创建的对象{}
,以及它的typeof
存在object
。对我来说,它似乎是 Object 类型的成员。我有什么误解?为什么Accessible
需要伪类型?伪类型和常规类型有什么区别?Integer
,例如,被称为伪类,但Number
对我来说似乎是类的扩展。
functional-programming - 对 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
是一个接受两个参数,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) → (a → b) → a → c
使用 a = f、b = a 和 c = b 重写第二个我得到
(f -> a -> b) -> (f -> a) -> f -> b
假设它ap
接受两个参数,其中第一个f
可能是一些包含函数a -> b
的函子,第二个可能是一些函f
子,其中包含a
返回一个函子,该函子将第一个函子的函数替换为给定的终点b
,然后函子包含a
.
好吧,退后一步,这两件事看起来有很大的不同,我无法理解他们如何以某种方式说同样的事情。
const S = f => g => x => f(x)(g(x))
ap(Identity(Math.sqrt), Identity(64))
根据我的理解,ap(F(g),F(a))
可以表达为F(a).map(g)
,我仍然很难等同于const S = f => g => x => f(x)(g(x))
。也许我误解了什么。
...也许我的误解与 的表达ap
以及它的相关性有关,f => g => x => f(x)(g(x))
因为我可以看到它们如何表达相同的签名,但我不认为它们是同一件事。
任何可以在这里提供一些认知帮助的人,我将不胜感激
javascript - 获取另一个属性指向的属性的最干净的 fp 方法是什么
给定一个可能为 null 且可能具有以下属性的对象:
您将如何以故障安全的方式获取模板?(可能没有定义templateId,或者它引用的模板可能未定义)
我使用 ramda 并试图调整我的原始代码版本以使用可能的 adt 之类的东西来避免显式的 null/undefined 检查。
我没有想出一个优雅而干净的解决方案。
天真的 ramda 版本:
这确实有效,但我想避免空检查,因为我的代码还有很多事情要做,变得更干净真的很好
编辑 我从几个答案中得到最好的答案是首先确保数据干净。但这并不总是可能的。我也想出了这个,我很喜欢。
希望获得有关它的干净程度和可读性的反馈(以及是否存在会破坏它的边缘情况)
javascript - 带有标识函子的 Sanctuary.Js 类型错误
我正在学习 YouTube 上的 Bartosz Milewski 范畴理论课程。他将 Const 和 Identity 函子描述为可以派生的“基础”函子(可能是我的自由解释)。
一旦我开始与地图和管道的 Sanctuary 库集成,我的问题就出现了,已经实现了 ES6+ / Fantasy-land(不重要)版本的函子。
实现非常简单
这是一些简单的用法(因为我也在使用离子衍生透镜)
但是 Const 仿函数工作得更好一些(地图中没有调用 f)
此外,通过删除类型检查证明一切都是“逻辑上合理的”
或用 ramda 替换 sanctuary。所以它看起来像是身份映射函数的某种类型一致性问题。
问题是我如何让所有这些部分以一种快乐的方式一起玩。