I'm trying to learn GHC Generics. After reviewing several examples, I wanted to try to create a generic Functor instances (disregarding that GHC can derive them automatically for me). However, I realized I have no idea how to work with a parametrized data types with Generics, all the examples I've seen were of kind *. Is this possible, and if yes, how? (I'm also interested in other similar frameworks, such as SYB.)
How to construct generic Functor instances using GHC.Generics (or other similar frameworks)?
550 views Asked by Petr At
2
There are 2 answers
5
Sjoerd Visscher
On
There is a Generic1 class for data types of kind * -> *. Working with it is mostly the same as with data types of kind *, except there's also Par1 for the parameter. I've used it in my unfoldable package for example.
Related Questions in GENERICS
- Go: "embedded type cannot be a type parameter"
- In Rust, how to inspect values captured by a closure?
- How to declare abstract class static fields in Python?
- Default type parameters on Rust structs: is it possible to provide a default type containing a lifetime?
- What line of code do I change to avoid duplication in a linked list?
- phpstan - return a generic
- No exact matches in reference to static method 'buildExpression'
- How to create a string literal based on generic character type in c++20?
- How to write a reusable DB transaction wrapper?
- Typescript generic initially infers then is set
- How does instanceof with generics work in Java despite type erasure?
- How to use generic classes with fields of another generic class of the same generic type?
- Getting List<T> from object[] in generic method
- How to call a method on a generic type from inside the generic class?
- Is there a way to use static member as an interface in dart?
Related Questions in HASKELL
- Typeclass projections as inheritance
- How to generate all possible matrices given a number n in Haskell
- Is there a way to get `cabal` to detect changes to non-Haskell source files?
- How to have fixed options using Option.Applicative in haskell?
- How can I create a thread in Haskell that will restart if it gets killed due to any reason?
- Automatic Jacobian matrix in Haskell
- Haskell writing to named pipe unexpectedly fails with `openFile: does not exist (No such device or address)`
- Why does Enum require to implement toEnum and fromEnum, if that's not enough for types larger than Int?
- Non-exhaustive patterns in function compress
- How to get terms names of GADT in Template Haskell?
- Implementing eval() function with Happy parser generator
- How to count the occurences of every element in a list in Haskell fast?
- In Haskell, what does `Con Int` mean?
- Extract a Maybe from a heterogeneous collection
- Haskell, Stack, importing module shows error "Module not found"
Related Questions in GHC
- How to use GHC’s `ReadPrec`?
- Homebrew error when installing GHC: linker does not have option `-no_fixup_chains`
- Why does Cabal, unlike GHC, not automatically enable GeneralizedNewtypeDeriving if I explicitly enabled DerivingStrategies?
- Understanding and Optimizing Generational Garbage Collection in Haskell
- Run cleanup function in multiple Haskell child threads when POSIX Signal sent (SIGTERM etc)
- libffi.so link issue for Haskell compiled executable on Linux platforms
- Admissble type role overrides
- How to change the order of type application parameters for a constructor
- Why does Data.Dynamic contain a witness instead of a typeclass constraint?
- cabal link error undefined symbol on windows
- Haskell speed issue where executing both parts of a program takes significantly longer than either part alone
- Haskell's polymorphic functions in different GHC version
- Haskell - Cabal linker command failed when installing Text.Regex.Posix
- Working around conflict between `c-source` name and GHC RTS name
- GHC API equivalent of adding a C/C++ file/object to the compilation
Related Questions in SCRAP-YOUR-BOILERPLATE
- SYB `mkT` function in Scala
- SYB `cast` function in Scala
- Haskell syb Data.Generics not working as expected
- Matching higher-kinded types in SYB
- How to use Data.Data?
- A function for returning part of a product or record depending on parameter and requested return type
- Traversing polymorphic structures and performing a transformation only in few cases
- Scrapping the boilerplate of doing variable substitution in an expression
- How to fold over a constructor with special cases?
- Recursive Type Lensing
- How to traverse a Seq with the Scrap Your Boileplate combinator "everything" in Shapeless?
- SYB Libraries functions
- Understanding Constr type of Data.Data package of Haskell
- Visiting GHC AST with SYB
- SYB: can a map over the result of listify be rewritten with a gfoldl?
Related Questions in GHC-GENERICS
- Decode list to generic data with 4 selectors
- Using `generics-sop` to get type metadata info at compile time
- How to use syb mkM
- Statically analyze type with Generics
- Record of maps with compositional lookups and updates?
- generics-sop: lifting a polymorphic action into a product
- Deriving projection functions using `generics-sop`
- How to "reuse" instance definitions from another typeclass while introduding minor differences?
- Defining an "mempty"-like function with GHC Generics?
- Would it be possible to derive Data.Vector.Unbox via GHC's generic deriving?
- Constructing a n-ary product with all the values of a simple sum type
- How to derive generic traversals that involve a type family
- Using type families and Generics to find an Id value
- Extracting an Id with GHC.Generics
- deriving Generic and ToJSON at the same time?
Popular Questions
- How do I undo the most recent local commits in Git?
- How can I remove a specific item from an array in JavaScript?
- How do I delete a Git branch locally and remotely?
- Find all files containing a specific text (string) on Linux?
- How do I revert a Git repository to a previous commit?
- How do I create an HTML button that acts like a link?
- How do I check out a remote Git branch?
- How do I force "git pull" to overwrite local files?
- How do I list all files of a directory?
- How to check whether a string contains a substring in JavaScript?
- How do I redirect to another webpage?
- How can I iterate over rows in a Pandas DataFrame?
- How do I convert a String to an int in Java?
- Does Python have a string 'contains' substring method?
- How do I check if a string contains a specific word?
Trending Questions
- UIImageView Frame Doesn't Reflect Constraints
- Is it possible to use adb commands to click on a view by finding its ID?
- How to create a new web character symbol recognizable by html/javascript?
- Why isn't my CSS3 animation smooth in Google Chrome (but very smooth on other browsers)?
- Heap Gives Page Fault
- Connect ffmpeg to Visual Studio 2008
- Both Object- and ValueAnimator jumps when Duration is set above API LvL 24
- How to avoid default initialization of objects in std::vector?
- second argument of the command line arguments in a format other than char** argv or char* argv[]
- How to improve efficiency of algorithm which generates next lexicographic permutation?
- Navigating to the another actvity app getting crash in android
- How to read the particular message format in android and store in sqlite database?
- Resetting inventory status after order is cancelled
- Efficiently compute powers of X in SSE/AVX
- Insert into an external database using ajax and php : POST 500 (Internal Server Error)
The best place to look for lots of example functions using GHC Generics is the
generic-derivingpackage. There's a generic definition of theFunctorclass in there. Copying (slightly simplified) fromGenerics.Deriving.Functor:To use this on a datatype, you have to derive
Generic1rather thanGeneric. The key difference of theGeneric1representation is that it makes use of thePar1datatype that encodes parameter positions.