Summary
In Haskell 98 the name of a record field is automatically also the name of a function which gets the value of the according field. E.g. if we have data Pair a b = Pair first :: a, second :: b then > first :: Pair a b -> a > second :: Pair a b -> b However for setting or modifying a field value we need to use some syntactic sugar, which is often clumsy. modifyFirst :: (a -> a) -> (Pair a b -> Pair a b) modifyFirst f r\@(Pair first=a ) = r first = f a With this package you can define record field accessors which allow setting, getting and modifying values easily. The package clearly demonstrates the power of the functional approach: You can combine accessors of a record and sub-records, to make the access look like the fields of the sub-record belong to the main record. Example: > *Data.Accessor.Example> (first^:second^=10) (('b',7),"hallo") > (('b',10),"hallo") You can easily manipulate record fields in a 'Control.Monad.State.State' monad, you can easily code 'Show' instances that use the Accessor syntax and you can parse binary streams into records. See @Data.Accessor.Example@ for demonstration of all features. It would be great if in revised Haskell versions the names of record fields are automatically 'Data.Accessor.Accessor's rather than plain @get@ functions. For now, the package @data-accessor-template@ provides Template Haskell functions for automated generation of 'Data.Acesssor.Accessor's. See also the other @data-accessor@ packages that provide an Accessor interface to other data types. The package @enumset@ provides accessors to bit-packed records. For similar packages see @lenses@ and @fclabel@. A related concept are editors <http://conal.net/blog/posts/semantic-editor-combinators/>. Editors only consist of a modify method (and @modify@ applied to a 'const' function is a @set@ function). This way, they can modify all function values of a function at once, whereas an accessor can only change a single function value, say, it can change @f 0 = 1@ to @f 0 = 2@. This way, editors can even change the type of a record or a function. An Arrow instance can be defined for editors, but for accessors only a Category instance is possible ('(.)' method). The reason is the @arr@ method of the @Arrow@ class, that conflicts with the two-way nature (set and get) of accessors.
Versions
v0.2.3 :: 0/0.2.3 :: gentoo
- Modified
- License
- BSD
- Keywords
- ~amd64 ~x86
- USE flags
- doc hscolour profile
USE flags
General
Dependencies
dev-haskell / cabal : A framework for packaging Haskell software
dev-haskell / hscolour : Colourise Haskell code
Runtime Dependencies
Depending packages
dev-haskell / idiii : ID3v2 (tagging standard for MP3 files) library
Change logs
- Repository mirror & CI · gentoo
Merge updates from master - Sergei Trofimovich · gentoo
dev-haskell/data-accessor: drop old
Package-Manager: Portage-3.0.6, Repoman-3.0.1 Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org> - Repository mirror & CI · gentoo
Merge updates from master - Alexey Sokolov · gentoo
dev-haskell/data-accessor: update homepage
Package-Manager: Portage-2.3.99, Repoman-2.3.22 Signed-off-by: Alexey Sokolov <sokolov@google.com> Signed-off-by: Aaron Bauman <bman@gentoo.org> - Repository mirror & CI · gentoo
Merge updates from master - Sergei Trofimovich · gentoo
dev-haskell/data-accessor: bump up to 0.2.3
Package-Manager: Portage-2.3.81, Repoman-2.3.20 Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org> - Repository mirror & CI · gentoo
Merge updates from master - Michał Górny · gentoo
*/*: Inline mirror://hackage and update URIs
This change inlines mirror://hackage in all ebuilds, and updates URIs to the modern form (old URIs redirect to that). The change has been made using the following command: find -name '*.ebuild' -exec sed -r -i \ -e 's@mirror://hackage/@https://hackage.haskell.org/@g' \ -e 's@https://hackage.haskell.org/packages/archive/([^/]*)/([^/]*)/@https://hackage.haskell.org/package/\1-\2/@g' \ -e '/hackage\.haskell\.org/s@\$\{PN}-\$\{PV}@${P}@g' \ -e '/hackage\.haskell\.org/s@\$\{MY_PN}-\$\{PV}@${MY_P}@g' \ -e '/hackage\.haskell\.org/s@\$\{PN}-\$\{MY_PV}@${MY_P}@g' \ {} + Signed-off-by: Michał Górny <mgorny@gentoo.org> - Robin H. Johnson · gentoo
Drop $Id$ per council decision in bug #611234.
Signed-off-by: Robin H. Johnson <robbat2@gentoo.org> - Sergei Trofimovich · gentoo
dev-haskell/data-accessor: access library to record fields, a depend of dev-haskell/idiii
Package-Manager: portage-2.3.0