(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

稳定高效的流量提升解决方案,助力品牌曝光
稳定高效的流量提升解决方案,助力品牌曝光


最新版Sora2模型免费使用,一键生成无水印视频
最新版Sora2模型免费使用,一键生成无水印视频


实时语音翻译/同声传译工具
Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。


选题、配图、成文,一站式创作,让内容运营更高效
讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。


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


最强AI数据分析助手
小浣熊家族Raccoon,您的AI智能助手,致力于通过先进的人工智能技术,为用户提供高效、便捷的智能服务。无论是日常咨询还是专业问题解答,小浣熊都能以快速、准确的响应满足您的需求,让您的生活更加 智能便捷。


像人一样思考的AI智能体
imini 是一款超级AI智能体,能根据人类指令,自主思考、自主完成、并且交付结果的AI智能体。


AI数字人视频创作平台
Keevx 一款开箱即用的AI数字人视频创作平台,广泛适用于电商广告、企业培训与社媒宣传,让全球企业与个人创作者无需拍摄剪辑,就能快速生成多语言、高质量的专业视频。


一站式AI创作平台
提供 AI 驱动的图片、视频生成及数字人等功能,助力创意创作


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

微信扫一扫关注公众号