(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音乐社区,致力让每个人都能用音乐表达自我。音述AI提供零门槛AI创作工具,独创GETI法则帮助用户精准定义音乐风格,AI润色功能支持自动优化作品质感。音述AI支持交流讨论、二次创作与价值变现。针对中文用户的语言习惯与文化背景进行专门优化,支持国风融合、C-pop等本土音乐标签,让技术更好地承载人文表达。


阿里Qoder团队推出的桌面端AI智能体
QoderWork 是阿里推出的本地优先桌面 AI 智能体,适配 macOS14+/Windows10+,以自然语言交互实现文件管理、数据分析、AI 视觉生成、浏览器自动化等办公任务,自主拆解执行复杂工作流,数据本地运行零上传,技能市场可无限扩展,是高效的 Agentic 生产力办公助手。


一站式搞定所有学习需求
不再被海量信息淹没,开始真正理解知识。Lynote 可摘要 YouTube 视频、PDF、文章等内容。即时创建笔记,检测 AI 内容并下载资料,将您的学习效率提升 10 倍。


为AI短剧协作而生
专为AI短剧协作而生的AniShort正式发布,深度重构AI短剧全流程生产模式,整合创意策划、制作执行、实时协作、在线审片、资产复用等全链路功能,独创无限画布、双轨并行工业化工作流与Ani智能体助手,集成多款主流AI大模型,破解素材零散、版本混乱、沟通低效等行业痛点,助力3人团队效率提升800%,打造标准化、可追溯的AI短剧量产体系,是AI短剧团队协同创作、提升制作效率的核心工具。


能听懂你表达的视频模型
Seedance two是基于seedance2.0的中国大模型,支持图像、视频、音频、文本四种模态输入,表达方式更丰富,生成也更可控。


国内直接访问,限时3折
输入简单文字,生成想要的图片,纳米香蕉中文站基于 Google 模型的 AI 图片生成网站,支持文字生图、图生图。官网价格限时3折活动


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


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


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


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