name: cluss category: type system, constraints version: 0.2 x-revision: 1 license: BSD3 license-file: LICENSE cabal-version: >= 1.10 tested-with: GHC==7.8.3 author: Yusuke Matsushita maintainer: Yusuke Matsushita stability: provisional homepage: https://github.com/Kinokkory/cluss bug-reports: https://github.com/Kinokkory/cluss/issues copyright: (c) Yusuke Matsushita 2014 synopsis: simple alternative to type classes description: A *cluss* enables you to achieve function overloading, or ad-hoc polymorphism, without creating a new type class. . In order to give ad-hoc polymorphism to a type variable @a@, you simply use @'In'@ with a list of \"type patterns\" like @In [Type T, ...] a@, which indicates that the type matches some of the patterns; which is analogous to a type class indicating that a type matches some of its \"instances\". The constraint @In [Type T, ...] a@ is what we call a \"cluss\". . Clusses can easily be used in a nested way and even be __recursive__; therefore, they are /expressive/ enough to imitate Haskell-98-style type classes. . Clusses, /however/, go beyond a mere alternative to type classes. They have __closed__ and __prioritized__ instances and __open__ methods, while type classes have open and unprioritized instances and closed methods. Those properties give clusses the advantages different from type classes: . * You can /judge/ whether a type @a@ belongs to a cluss @'In' as@, on some level, writing @Has as a@, since cluss instances are closed. . * You can make cluss instances more /flexibly/, without causing overlapping instances or incoherent instances, since cluss instances are prioritized. . * You can /create/ new methods for clusses anywhere in any module, since cluss methods are open. . More information can be found in the or the . build-type: Simple source-repository head type: git location: git@github.com:Kinokkory/cluss.git library hs-source-dirs: src default-language: Haskell2010 other-extensions: Trustworthy, ScopedTypeVariables, TypeOperators, RankNTypes, TypeFamilies, DataKinds, ConstraintKinds, PolyKinds, MultiParamTypeClasses, FlexibleInstances, UndecidableInstances, FlexibleContexts build-depends: base ==4.*, template-haskell >=2.5 exposed-modules: Type.Cluss, Type.Cluss.TH ghc-options: -Wall