{"id":13630760,"url":"https://github.com/i-am-tom/haskell-exercises","last_synced_at":"2025-04-04T09:09:12.868Z","repository":{"id":38007700,"uuid":"146182765","full_name":"i-am-tom/haskell-exercises","owner":"i-am-tom","description":"A little course to learn about some of the more obscure GHC extensions.","archived":false,"fork":false,"pushed_at":"2023-11-07T17:54:13.000Z","size":124,"stargazers_count":626,"open_issues_count":0,"forks_count":95,"subscribers_count":18,"default_branch":"master","last_synced_at":"2024-02-17T10:38:08.996Z","etag":null,"topics":["functional-programming","ghc","haskell","haskell-learning","teaching-materials"],"latest_commit_sha":null,"homepage":"","language":"Haskell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/i-am-tom.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-08-26T13:26:18.000Z","updated_at":"2024-05-30T04:34:32.755Z","dependencies_parsed_at":"2022-08-08T22:45:57.358Z","dependency_job_id":"4b76d8f9-ed60-4c77-904e-4d7e83af4148","html_url":"https://github.com/i-am-tom/haskell-exercises","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/i-am-tom%2Fhaskell-exercises","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/i-am-tom%2Fhaskell-exercises/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/i-am-tom%2Fhaskell-exercises/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/i-am-tom%2Fhaskell-exercises/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/i-am-tom","download_url":"https://codeload.github.com/i-am-tom/haskell-exercises/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247149502,"owners_count":20891954,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["functional-programming","ghc","haskell","haskell-learning","teaching-materials"],"created_at":"2024-08-01T22:01:58.729Z","updated_at":"2025-04-04T09:09:12.852Z","avatar_url":"https://github.com/i-am-tom.png","language":"Haskell","funding_links":[],"categories":["Haskell"],"sub_categories":[],"readme":"# GHC exercises 🚀\n\n_For solutions, please see the `Exercises.hs` modules inside [the `answers`\nbranch](https://github.com/i-am-tom/haskell-exercises/tree/answers)._\n\nOK, you know your **monoids** from your **monads**. You know how to write a\nterminal application or two. What's next? What are these language extensions\nthat keep being mentioned? How \"type-safe\" can you _really_ be?\n\nThis repository, I hope, will provide some **stepping stones**. We'll go\nthrough extensions one at a time, and build up a richer vocabulary for talking\nabout Haskell programs, and look to move our assertions up into types, where\nthey can be verified at compile time.\n\n---\n\n## What this _isn't_.\n\nThis is a deep dive into GHC extensions, the power that each one gives us, and\nhow we can combine extensions to achieve very strong guarantees at\ncompile-time. This is _not_ based around concepts; there won't be sections on\n\"dependently-typed programming\", or \"generic programming\", though these\nconcepts will turn up throughout as we dig deeper into the extensions.\n\n\u003e If you're interested in something more project-based, I absolutely, 1000%\n\u003e recommend [Thinking with Types](https://leanpub.com/thinking-with-types), \n\u003e written by [Sandy Maguire](https://github.com/isovector). It is a\n\u003e **fantastic** resource, and one on which I already rely when explaining\n\u003e concepts to others.\n\n## Contents\n\n1.  `GADTs`\n2.  `FlexibleInstances`\n3.  `KindSignatures`\n4.  `DataKinds`\n5.  `RankNTypes`\n6.  `TypeFamilies`\n7.  `ConstraintKinds`\n8.  `PolyKinds`\n9.  `MultiParamTypeClasses`\n10. `FunctionalDependencies`\n\n## Setup\n\nAssuming you have [Cabal](https://www.haskell.org/cabal/) or\n[Stack](https://docs.haskellstack.org/en/stable/README/) setup, you should be\nable to navigate to any of the `exercise*` directories, and run your usual\ncommands:\n\n### Repl\n\n```\n$ stack repl\n$ cabal repl\n```\n\n### Build\n\n```\n$ stack build\n$ cabal build\n```\n\nIt's going to make it a lot easier to iterate through the exercises if you\n`cabal install ghcid` or `stack install ghcid`. Just as above, once this is\ndone, you can navigate to the exercise directory and run it with your preferred\nrepl command:\n\n```\n$ ghcid -c \"stack repl\"\n$ ghcid -c \"cabal repl\"\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fi-am-tom%2Fhaskell-exercises","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fi-am-tom%2Fhaskell-exercises","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fi-am-tom%2Fhaskell-exercises/lists"}