(aka "Algebraic JavaScript Specification")
<img src="logo.png" width="200" height="200" />This project specifies interoperability of common algebraic structures:
An algebra is a set of values, a set of operators that it is closed under and some laws it must obey.
Each Fantasy Land algebra is a separate specification. An algebra may have dependencies on other algebras which must be implemented.
The type signature notation used in this document is described below:<sup id="sanctuary-types-return">1</sup>
:: "is a member of".
e :: t can be read as: "the expression e is a member of type t".true :: Boolean - "true is a member of type Boolean".42 :: Integer, Number - "42 is a member of the Integer and
Number types".Array is a type constructor which takes one type argument.Array String is the type of all arrays of strings. Each of the
following has type Array String: [], ['foo', 'bar', 'baz'].Array (Array String) is the type of all arrays of arrays of strings.
Each of the following has type Array (Array String): [], [ [], [] ], [ [], ['foo'], ['bar', 'baz'] ].-> (arrow) Function type constructor.
-> is an infix type constructor that takes two type arguments where
left argument is the input type and the right argument is the output type.->'s input type can be a grouping of types to create the type of a
function which accepts zero or more arguments. The syntax is:
(<input-types>) -> <output-type>, where <input-types> comprises zero
or more comma–space (, )-separated type representations and parens
may be omitted for unary functions.String -> Array String is a type satisfied by functions which take a
String and return an Array String.String -> Array String -> Array String is a type satisfied by functions
which take a String and return a function which takes an Array String
and returns an Array String.(String, Array String) -> Array String is a type satisfied by functions
which take a String and an Array String as arguments and return an
Array String.() -> Number is a type satisfied by functions
which do not take arguments and return a Number.~> (squiggly arrow) Method type constructor.
a ~> a -> a is a type satisfied by methods on Objects of type a which
take a type a as an argument and return a value of type a.=> (fat arrow) Expresses constraints on type variables.
a ~> a -> a (see squiggly arrow above), a can be of any type.
Semigroup a => a ~> a -> a adds a constraint such that the type a
must now satisfy the Semigroup typeclass. To satisfy a typeclass means
to lawfully implement all functions/methods specified by that typeclass.For example:
fantasy-land/traverse :: Applicative f, Traversable t => t a ~> (TypeRep f, a -> f b) -> f (t b)
'-------------------' '--------------------------' '-' '-------------------' '-----'
' ' ' ' '
' ' - type constraints ' ' - argument types ' - return type
' '
'- method name ' - method target type
Certain behaviours are defined from the perspective of a member of a type.
Other behaviours do not require a member. Thus certain algebras require a
type to provide a value-level representative (with certain properties). The
Identity type, for example, could provide Id as its type representative:
Id :: TypeRep Identity.
If a type provides a type representative, each member of the type must have
a constructor property which is a reference to the type representative.
a['fantasy-land/equals'](a) === true (reflexivity)a['fantasy-land/equals'](b) === b['fantasy-land/equals'](a) (symmetry)a['fantasy-land/equals'](b) and b['fantasy-land/equals'](c), then a['fantasy-land/equals'](c) (transitivity)<a name="equals-method"></a>
fantasy-land/equals methodfantasy-land/equals :: Setoid a => a ~> a -> Boolean
A value which has a Setoid must provide a fantasy-land/equals method. The
fantasy-land/equals method takes one argument:
a['fantasy-land/equals'](b)
b must be a value of the same Setoid
b is not the same Setoid, behaviour of fantasy-land/equals is
unspecified (returning false is recommended).fantasy-land/equals must return a boolean (true or false).
A value that implements the Ord specification must also implement the Setoid specification.
a['fantasy-land/lte'](b) or b['fantasy-land/lte'](a) (totality)a['fantasy-land/lte'](b) and b['fantasy-land/lte'](a), then a['fantasy-land/equals'](b) (antisymmetry)a['fantasy-land/lte'](b) and b['fantasy-land/lte'](c), then a['fantasy-land/lte'](c) (transitivity)<a name="lte-method"></a>
fantasy-land/lte methodfantasy-land/lte :: Ord a => a ~> a -> Boolean
A value which has an Ord must provide a fantasy-land/lte method. The
fantasy-land/lte method takes one argument:
a['fantasy-land/lte'](b)
b must be a value of the same Ord
b is not the same Ord, behaviour of fantasy-land/lte is
unspecified (returning false is recommended).fantasy-land/lte must return a boolean (true or false).
a['fantasy-land/compose'](b)['fantasy-land/compose'](c) === a['fantasy-land/compose'](b['fantasy-land/compose'](c)) (associativity)<a name="compose-method"></a>
fantasy-land/compose methodfantasy-land/compose :: Semigroupoid c => c i j ~> c j k -> c i k
A value which has a Semigroupoid must provide a fantasy-land/compose method. The
fantasy-land/compose method takes one argument:
a['fantasy-land/compose'](b)
b must be a value of the same Semigroupoid
b is not the same semigroupoid, behaviour of fantasy-land/compose is
unspecified.fantasy-land/compose must return a value of the same Semigroupoid.
A value that implements the Category specification must also implement the Semigroupoid specification.
a['fantasy-land/compose'](C['fantasy-land/id']()) is equivalent to a (right identity)C['fantasy-land/id']()['fantasy-land/compose'](a) is equivalent to a (left identity)<a name="id-method"></a>
fantasy-land/id methodfantasy-land/id :: Category c => () -> c a a
A value which has a Category must provide a fantasy-land/id function on its
type representative:
C['fantasy-land/id']()
Given a value c, one can access its type representative via the
constructor property:
c.constructor['fantasy-land/id']()
fantasy-land/id must return a value of the same Categorya['fantasy-land/concat'](b)['fantasy-land/concat'](c) is equivalent to a['fantasy-land/concat'](b['fantasy-land/concat'](c)) (associativity)<a name="concat-method"></a>
fantasy-land/concat methodfantasy-land/concat :: Semigroup a => a ~> a -> a
A value which has a Semigroup must provide a fantasy-land/concat method. The
fantasy-land/concat method takes one argument:
s['fantasy-land/concat'](b)
b must be a value of the same Semigroup
b is not the same semigroup, behaviour of fantasy-land/concat is
unspecified.fantasy-land/concat must return a value of the same Semigroup.
A value that implements the Monoid specification must also implement the Semigroup specification.
m['fantasy-land/concat'](M['fantasy-land/empty']()) is equivalent to m (right identity)M['fantasy-land/empty']()['fantasy-land/concat'](m) is equivalent to m (left identity)<a name="empty-method"></a>
fantasy-land/empty methodfantasy-land/empty :: Monoid m => () -> m
A value which has a Monoid must provide a fantasy-land/empty function on its
type representative:
M['fantasy-land/empty']()
Given a value m, one can access its type representative via the
constructor property:
m.constructor['fantasy-land/empty']()
fantasy-land/empty must return a value of the same MonoidA value that implements the Group specification must also implement the Monoid specification.
g['fantasy-land/concat'](g['fantasy-land/invert']()) is equivalent to g.constructor['fantasy-land/empty']() (right inverse)g['fantasy-land/invert']()['fantasy-land/concat'](g) is equivalent to g.constructor['fantasy-land/empty']() (left inverse)<a name="invert-method"></a>
fantasy-land/invert methodfantasy-land/invert :: Group g => g ~> () -> g
A value which has a Group must provide a fantasy-land/invert method. The
fantasy-land/invert method takes no arguments:
g['fantasy-land/invert']()
fantasy-land/invert must return a value of the same Group.v['fantasy-land/filter'](x => p(x) && q(x)) is equivalent to v['fantasy-land/filter'](p)['fantasy-land/filter'](q) (distributivity)v['fantasy-land/filter'](x => true) is equivalent to v (identity)v['fantasy-land/filter'](x => false) is equivalent to w['fantasy-land/filter'](x => false)
if v and w are values of the same Filterable (annihilation)<a name="filter-method"></a>
fantasy-land/filter methodfantasy-land/filter :: Filterable f => f a ~> (a -> Boolean) -> f a
A value which has a Filterable must provide a fantasy-land/filter method. The fantasy-land/filter
method takes one argument:
v['fantasy-land/filter'](p)
p must be a function.
p is not a function, the behaviour of fantasy-land/filter is unspecified.p must return either true or false. If it returns any other value,
the behaviour of fantasy-land/filter is unspecified.fantasy-land/filter must return a value of the same Filterable.
u['fantasy-land/map'](a => a) is equivalent to u (identity)u['fantasy-land/map'](x => f(g(x))) is equivalent to u['fantasy-land/map'](g)['fantasy-land/map'](f) (composition)<a name="map-method"></a>
fantasy-land/map methodfantasy-land/map :: Functor f => f a ~> (a -> b) -> f b
A value which has a Functor must provide a fantasy-land/map method. The fantasy-land/map
method takes one argument:
u['fantasy-land/map'](f)
f must be a function,
f is not a function, the behaviour of fantasy-land/map is
unspecified.f can return any value.f's return value should be checked.fantasy-land/map must return a value of the same Functor
u['fantasy-land/contramap'](a => a) is equivalent to u (identity)u['fantasy-land/contramap'](x => f(g(x))) is equivalent to u['fantasy-land/contramap'](f)['fantasy-land/contramap'](g)
(composition)<a name="contramap-method"></a>
fantasy-land/contramap methodfantasy-land/contramap :: Contravariant f => f a ~> (b -> a) -> f b
A value which has a Contravariant must provide a fantasy-land/contramap method. The
fantasy-land/contramap method takes one argument:
u['fantasy-land/contramap'](f)
f must be a function,
f is not a function, the behaviour of

职场AI,就用扣子
AI办公助手,复杂任务高效处理。办公效率低?扣子空间AI助手支持播客生成、PPT制作、网页开发及报告写作,覆盖科研、商业、舆情等领域的专家Agent 7x24小时响应,生活工作无缝切换,提升50%效率!


多风格AI绘画神器
堆友平台由阿里巴巴设计团队创建,作为一款AI驱动的设计工具,专为设计师提供一站式增长服务。功能覆盖海量3D素材、AI绘画、实时渲染以及专业抠图,显著提升设计品质和效率。平台不仅提供工具,还是一个促进创意交流和个人发展的空间,界面友好,适合所有级别的设计师和创意工作者。


零代码AI应用开发平台
零代码AI应用开发平台,用户只需一句话简单描述需求,AI能自动生成小程序、APP或H5网页应用,无需编写代码。


免费创建高清无水印Sora视频
Vora是一个免费创建高清无水印Sora视频的AI工具


最适合小白的AI自动化工作流平台
无需编码,轻松生成可复用、可变现的AI自动化工作流

大模型驱动的Excel数据处理工具
基于大模型交互的表格处理系统,允许用户通过对话方式完成数据整理和可视化分析。系统采用机器学习算法解析用户指令,自动执行排序、公式计算和数据透视等操作,支持多种文件格式导入导出。数据处理响应速度保持在0.8秒以内,支持超过100万行数据的即时分析。


AI辅助编程,代码自动修复
Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。


AI论文写作指导平台
AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。


AI一键生成PPT,就用博思AIPPT!
博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。


AI赋能电商视觉革命,一站式智能商拍平台
潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量 提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。
最新AI工具、AI资讯
独家AI资源、AI项目落地

微信扫一扫关注公众号