├── .github ├── FUNDING.yml └── workflows │ ├── haskell.yaml │ └── release.yml ├── .gitignore ├── .vscode └── settings.json ├── Changelog.md ├── LICENSE ├── Proof ├── Equational.hs ├── Propositional.hs └── Propositional │ ├── Empty.hs │ ├── Inhabited.hs │ └── TH.hs ├── README.md ├── Setup.hs ├── cabal.project ├── ci-configs ├── cabal.project ├── ghc-9.10.1.config ├── ghc-9.12.2.config ├── ghc-9.2.8.config ├── ghc-9.4.8.config ├── ghc-9.6.5.config └── ghc-9.8.4.config ├── equational-reasoning.cabal ├── examples └── sandbox.hs └── fourmolu.yaml /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [konn] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 13 | -------------------------------------------------------------------------------- /.github/workflows/haskell.yaml: -------------------------------------------------------------------------------- 1 | name: Build 2 | 3 | on: 4 | push: 5 | branches: [ master ] 6 | pull_request: 7 | branches: [ master ] 8 | 9 | env: 10 | config-dir: 'ci-configs' 11 | 12 | jobs: 13 | enumerate: 14 | name: Generate Build Matrix Dynamically 15 | runs-on: ubuntu-latest 16 | outputs: 17 | configs: ${{ steps.enumerate.outputs.configs }} 18 | steps: 19 | - uses: actions/checkout@v4 20 | - name: Enumerate Configs 21 | id: enumerate 22 | run: | 23 | set -euxo pipefail 24 | find "${{env.config-dir}}"/ -type f -name 'ghc-*.config' \ 25 | | sort -h | jq -ncR '[inputs | {ghc: match("ghc-(.+)\\.config$", .) | .captures[0].string | select(.), plan: .}]' | tee configs.json 26 | echo "configs=$(cat configs.json)" >> "${GITHUB_OUTPUT}" 27 | build: 28 | name: Build 29 | needs: [enumerate] 30 | strategy: 31 | fail-fast: false 32 | matrix: 33 | include: ${{fromJSON(needs.enumerate.outputs.configs)}} 34 | runs-on: ubuntu-latest 35 | env: 36 | CABAL: cabal --project-file=${{matrix.plan}} 37 | continue-on-error: false 38 | 39 | steps: 40 | - uses: actions/checkout@v4 41 | - uses: haskell-actions/setup@v2 42 | with: 43 | ghc-version: ${{ matrix.ghc }} 44 | enable-stack: false 45 | 46 | - name: Cache ~/.cabal/store 47 | uses: actions/cache@v4 48 | env: 49 | cache-name: cache-cabal-store 50 | with: 51 | path: ~/.cabal/store 52 | key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ matrix.ghc }}-${{ hashFiles('**/*.cabal', '${{matrix.plan}}') }} 53 | restore-keys: | 54 | ${{ runner.os }}-build-${{ env.cache-name }}-${{ matrix.ghc }}- 55 | ${{ runner.os }}-build-${{ env.cache-name }}- 56 | 57 | - name: Cache dist-newstyle 58 | uses: actions/cache@v4 59 | env: 60 | cache-name: cache-dist-newstyle 61 | with: 62 | path: "dist-newstyle" 63 | key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ matrix.ghc }}-${{ hashFiles('**/*.cabal', '${{matrix.plan}}') }}-${{ hashFiles('**/*.hs') }} 64 | restore-keys: | 65 | ${{ runner.os }}-build-${{ env.cache-name }}-${{ matrix.ghc }}-${{ hashFiles('**/*.cabal', '${{matrix.plan}}') }}- 66 | ${{ runner.os }}-build-${{ env.cache-name }}-${{ matrix.ghc }}- 67 | ${{ runner.os }}-build-${{ env.cache-name }}- 68 | 69 | - name: Configure and update 70 | run: | 71 | ${CABAL} v2-configure 72 | ${CABAL} v2-update 73 | - name: Build 74 | run: | 75 | ${CABAL} v2-build 76 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | on: 3 | push: 4 | tags: 5 | - "v[0-9]*" 6 | 7 | jobs: 8 | hackage-release: 9 | name: Release to Hackage 10 | if: > 11 | github.event_name == 'push' 12 | && startsWith(github.ref, 'refs/tags/') 13 | environment: hackage 14 | runs-on: ubuntu-latest 15 | steps: 16 | - uses: actions/checkout@v3 17 | - uses: haskell-actions/setup@v2 18 | with: 19 | cabal-version: 3.12.1.0 20 | enable-stack: false 21 | - name: Cabal Check 22 | run: cabal check 23 | - name: Create tarball 24 | run: cabal sdist 25 | - uses: haskell-actions/hackage-publish@v1 26 | with: 27 | hackageToken: ${{ secrets.HACKAGE_ACCESS_TOKEN }} 28 | packagesPath: dist-newstyle/sdist 29 | publish: false 30 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ### https://raw.github.com/github/gitignore/14f8a8b4c51ecc00b18905a95c117954e6c77b9d/Haskell.gitignore 2 | 3 | dist 4 | dist-* 5 | cabal-dev 6 | *.o 7 | *.hi 8 | *.hie 9 | *.chi 10 | *.chs.h 11 | *.dyn_o 12 | *.dyn_hi 13 | .hpc 14 | .hsenv 15 | .cabal-sandbox/ 16 | cabal.sandbox.config 17 | *.prof 18 | *.aux 19 | *.hp 20 | *.eventlog 21 | .stack-work/ 22 | cabal.project.local 23 | cabal.project.local~ 24 | .HTF/ 25 | .ghc.environment.* 26 | 27 | 28 | ### https://raw.github.com/github/gitignore/14f8a8b4c51ecc00b18905a95c117954e6c77b9d/Global/VisualStudioCode.gitignore 29 | 30 | .vscode/* 31 | !.vscode/settings.json 32 | !.vscode/tasks.json 33 | !.vscode/launch.json 34 | !.vscode/extensions.json 35 | *.code-workspace 36 | 37 | # Local History for Visual Studio Code 38 | .history/ 39 | 40 | 41 | ### https://raw.github.com/github/gitignore/14f8a8b4c51ecc00b18905a95c117954e6c77b9d/Global/macOS.gitignore 42 | 43 | # General 44 | .DS_Store 45 | .AppleDouble 46 | .LSOverride 47 | 48 | # Icon must end with two \r 49 | Icon 50 | 51 | # Thumbnails 52 | ._* 53 | 54 | # Files that might appear in the root of a volume 55 | .DocumentRevisions-V100 56 | .fseventsd 57 | .Spotlight-V100 58 | .TemporaryItems 59 | .Trashes 60 | .VolumeIcon.icns 61 | .com.apple.timemachine.donotpresent 62 | 63 | # Directories potentially created on remote AFP share 64 | .AppleDB 65 | .AppleDesktop 66 | Network Trash Folder 67 | Temporary Items 68 | .apdisk 69 | 70 | 71 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "haskell.formattingProvider": "fourmolu" 3 | } -------------------------------------------------------------------------------- /Changelog.md: -------------------------------------------------------------------------------- 1 | Changelog 2 | ========== 3 | 4 | ## 0.7.1.0 5 | 6 | - Supports GHC 9.10 and 9.12 7 | - Drops support for GHC <9.2 8 | 9 | ## 0.7.0.2 10 | 11 | - Supports GHC 9.8 12 | - Drops support for GHC <9 13 | 14 | ## 0.6.0.3 15 | 16 | - Support for GHC >= 8.10 17 | 18 | ## 0.6.0.2 19 | 20 | - Adds support for th-desugar-1.11 21 | 22 | ## 0.6.0.1 23 | 24 | - Supports GHC 8.8. 25 | - Adds support for th-desugar-1.10 (Thanks: Justin Le @mstksg) 26 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2012, Hiromi ISHII 2 | 3 | All rights reserved. 4 | 5 | Redistribution and use in source and binary forms, with or without 6 | modification, are permitted provided that the following conditions are met: 7 | 8 | * Redistributions of source code must retain the above copyright 9 | notice, this list of conditions and the following disclaimer. 10 | 11 | * Redistributions in binary form must reproduce the above 12 | copyright notice, this list of conditions and the following 13 | disclaimer in the documentation and/or other materials provided 14 | with the distribution. 15 | 16 | * Neither the name of Hiromi ISHII nor the names of other 17 | contributors may be used to endorse or promote products derived 18 | from this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23 | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 24 | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25 | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 26 | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 | -------------------------------------------------------------------------------- /Proof/Equational.hs: -------------------------------------------------------------------------------- 1 | {-# LANGUAGE CPP #-} 2 | {-# LANGUAGE DataKinds #-} 3 | {-# LANGUAGE FlexibleContexts #-} 4 | {-# LANGUAGE GADTs #-} 5 | {-# LANGUAGE KindSignatures #-} 6 | {-# LANGUAGE PolyKinds #-} 7 | {-# LANGUAGE RankNTypes #-} 8 | {-# LANGUAGE ScopedTypeVariables #-} 9 | {-# LANGUAGE StandaloneDeriving #-} 10 | {-# LANGUAGE TypeFamilies #-} 11 | {-# LANGUAGE TypeOperators #-} 12 | {-# LANGUAGE TypeSynonymInstances #-} 13 | {-# LANGUAGE UndecidableInstances #-} 14 | 15 | #if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ >= 800 16 | {-# LANGUAGE ConstrainedClassMethods, TypeFamilyDependencies #-} 17 | #endif 18 | module Proof.Equational ( 19 | (:~:) (..), 20 | (:=:), 21 | sym, 22 | trans, 23 | Equality (..), 24 | Preorder (..), 25 | reflexivity', 26 | (:\/:), 27 | (:/\:), 28 | (=<=), 29 | (=>=), 30 | (=~=), 31 | Leibniz (..), 32 | Reason (..), 33 | because, 34 | by, 35 | (===), 36 | start, 37 | byDefinition, 38 | admitted, 39 | Proxy (..), 40 | cong, 41 | cong', 42 | Proposition (..), 43 | HVec (..), 44 | FromBool (..), 45 | applyNAry, 46 | applyNAry', 47 | fromBool', 48 | 49 | -- * Conversion between equalities 50 | fromRefl, 51 | fromLeibniz, 52 | reflToLeibniz, 53 | leibnizToRefl, 54 | 55 | -- * Coercion 56 | coerce, 57 | coerceInner, 58 | coerce', 59 | withRefl, 60 | 61 | -- * Re-exported modules 62 | module Data.Proxy, 63 | ) where 64 | 65 | import Data.Kind (Type) 66 | import Data.Proxy 67 | import Data.Type.Equality hiding (apply) 68 | import Unsafe.Coerce 69 | 70 | infix 4 :=: 71 | 72 | type a :\/: b = Either a b 73 | 74 | infixr 2 :\/: 75 | 76 | type a :/\: b = (a, b) 77 | 78 | infixr 3 :/\: 79 | 80 | type (:=:) = (:~:) 81 | 82 | data Leibniz a b = Leibniz {apply :: forall f. f a -> f b} 83 | 84 | leibnizToRefl :: Leibniz a b -> a :=: b 85 | leibnizToRefl eq = apply eq Refl 86 | 87 | fromLeibniz :: (Preorder eq) => Leibniz a b -> eq a b 88 | fromLeibniz eq = apply eq (reflexivity Proxy) 89 | 90 | fromRefl :: (Preorder eq) => a :=: b -> eq a b 91 | fromRefl Refl = reflexivity' 92 | 93 | reflToLeibniz :: a :=: b -> Leibniz a b 94 | reflToLeibniz Refl = Leibniz id 95 | 96 | class Preorder (eq :: k -> k -> Type) where 97 | reflexivity :: proxy a -> eq a a 98 | transitivity :: eq a b -> eq b c -> eq a c 99 | 100 | class (Preorder eq) => Equality (eq :: k -> k -> Type) where 101 | symmetry :: eq a b -> eq b a 102 | 103 | instance Preorder (:=:) where 104 | {-# SPECIALIZE instance Preorder (:=:) #-} 105 | transitivity Refl Refl = Refl 106 | {-# INLINE [1] transitivity #-} 107 | 108 | reflexivity _ = Refl 109 | {-# INLINE [1] reflexivity #-} 110 | 111 | instance Equality (:=:) where 112 | {-# SPECIALIZE instance Equality (:~:) #-} 113 | symmetry Refl = Refl 114 | {-# INLINE [1] symmetry #-} 115 | 116 | instance Preorder (->) where 117 | reflexivity _ = id 118 | transitivity = flip (.) 119 | 120 | leibniz_refl :: Leibniz a a 121 | leibniz_refl = Leibniz id 122 | 123 | instance Preorder Leibniz where 124 | reflexivity _ = leibniz_refl 125 | transitivity (Leibniz aEqb) (Leibniz bEqc) = Leibniz $ bEqc . aEqb 126 | 127 | instance Equality Leibniz where 128 | symmetry eq = unFlip $ apply eq $ Flip leibniz_refl 129 | 130 | newtype Flip f a b = Flip {unFlip :: f b a} 131 | 132 | data Reason eq x y where 133 | Because :: proxy y -> eq x y -> Reason eq x y 134 | 135 | reflexivity' :: (Preorder r) => r x x 136 | reflexivity' = reflexivity Proxy 137 | 138 | by, because :: proxy y -> eq x y -> Reason eq x y 139 | because = Because 140 | by = Because 141 | 142 | infixl 4 ===, =<=, =~=, =>= 143 | 144 | infix 5 `Because` 145 | 146 | infix 5 `because` 147 | 148 | (=<=) :: (Preorder r) => r x y -> Reason r y z -> r x z 149 | eq =<= (_ `Because` eq') = transitivity eq eq' 150 | {-# SPECIALIZE INLINE [1] (=<=) :: x :~: y -> Reason (:~:) y z -> x :~: z #-} 151 | 152 | (=>=) :: (Preorder r) => r y z -> Reason r x y -> r x z 153 | eq =>= (_ `Because` eq') = transitivity eq' eq 154 | {-# SPECIALIZE INLINE [1] (=>=) :: y :~: z -> Reason (:~:) x y -> x :~: z #-} 155 | 156 | (===) :: (Equality eq) => eq x y -> Reason eq y z -> eq x z 157 | (===) = (=<=) 158 | {-# SPECIALIZE INLINE [1] (===) :: x :~: y -> Reason (:~:) y z -> x :~: z #-} 159 | 160 | (=~=) :: r x y -> proxy y -> r x y 161 | eq =~= _ = eq 162 | 163 | start :: (Preorder eq) => proxy a -> eq a a 164 | start = reflexivity 165 | 166 | byDefinition :: (Preorder eq) => eq a a 167 | byDefinition = reflexivity Proxy 168 | 169 | admitted :: Reason eq x y 170 | admitted = undefined 171 | {-# WARNING admitted "There are some goals left yet unproven." #-} 172 | 173 | cong :: forall f a b. Proxy f -> a :=: b -> f a :=: f b 174 | cong Proxy Refl = Refl 175 | 176 | cong' :: (pxy m -> pxy (f m)) -> a :=: b -> f a :=: f b 177 | cong' _ Refl = Refl 178 | 179 | {- | Type coercion. 'coerce' is using @unsafeCoerce a@. 180 | So, please, please do not provide the @undefined@ as the proof. 181 | Using this function instead of pattern-matching on equality proof, 182 | you can reduce the overhead introduced by run-time proof. 183 | -} 184 | coerceInner, coerce :: (a :=: b) -> f a -> f b 185 | {-# DEPRECATED coerce "Use coerceInner instead" #-} 186 | coerce = coerceInner 187 | {-# INLINE coerce #-} 188 | coerceInner _ = unsafeCoerce 189 | {-# INLINE [1] coerceInner #-} 190 | 191 | -- | Coercion for identity types. 192 | coerce' :: a :=: b -> a -> b 193 | coerce' _ = unsafeCoerce 194 | {-# INLINE [1] coerce' #-} 195 | 196 | {-# RULES 197 | "coerce/unsafeCoerce" [~1] forall xs. 198 | coerceInner xs = 199 | unsafeCoerce 200 | "coerce'/unsafeCoerce" [~1] forall xs. 201 | coerce' xs = 202 | unsafeCoerce 203 | #-} 204 | 205 | {- | Solves equality constraint without explicit coercion. 206 | It has the same effect as @'Data.Type.Equality.gcastWith'@, 207 | but some hacks is done to reduce runtime overhead. 208 | -} 209 | withRefl :: forall a b r. a :~: b -> ((a ~ b) => r) -> r 210 | withRefl _ = gcastWith (unsafeCoerce (Refl :: () :~: ()) :: a :~: b) 211 | 212 | class Proposition (f :: k -> Type) where 213 | type OriginalProp (f :: k -> Type) (n :: k) :: Type 214 | unWrap :: f n -> OriginalProp f n 215 | wrap :: OriginalProp f n -> f n 216 | 217 | data HVec (xs :: [Type]) where 218 | HNil :: HVec '[] 219 | (:-) :: x -> HVec xs -> HVec (x ': xs) 220 | 221 | infixr 9 :- 222 | 223 | type family (xs :: [Type]) :~> (a :: Type) :: Type where 224 | '[] :~> a = a 225 | (x ': xs) :~> a = x -> (xs :~> a) 226 | 227 | infixr 1 :~> 228 | 229 | data HVecView (xs :: [Type]) :: Type where 230 | HNilView :: HVecView '[] 231 | HConsView :: Proxy t -> HVecView ts -> HVecView (t ': ts) 232 | 233 | deriving instance Show (HVecView xs) 234 | 235 | class KnownTypeList (xs :: [Type]) where 236 | viewHVec' :: HVecView xs 237 | 238 | instance KnownTypeList '[] where 239 | viewHVec' = HNilView 240 | 241 | instance (KnownTypeList ts) => KnownTypeList (t ': ts) where 242 | viewHVec' = HConsView Proxy viewHVec' 243 | 244 | newtype Magic (xs :: [Type]) a = Magic {_viewHVec' :: (KnownTypeList xs) => a} 245 | 246 | withKnownTypeList :: forall a xs. HVecView xs -> ((KnownTypeList xs) => a) -> a 247 | withKnownTypeList xs f = (unsafeCoerce (Magic f :: Magic xs a) :: HVecView xs -> a) xs 248 | 249 | apply' :: HVecView ts -> (HVec ts -> c) -> ts :~> c 250 | apply' HNilView f = f HNil 251 | apply' (HConsView Proxy ts) f = \a -> 252 | withKnownTypeList ts $ 253 | apply' ts (\ts' -> f $ a :- ts') 254 | 255 | applyNAry :: forall ts c. (KnownTypeList ts) => (HVec ts -> c) -> ts :~> c 256 | applyNAry = apply' (viewHVec' :: HVecView ts) 257 | 258 | applyNAry' :: (KnownTypeList ts) => proxy ts -> proxy' c -> (HVec ts -> c) -> ts :~> c 259 | applyNAry' _ _ = applyNAry 260 | 261 | class FromBool (c :: Type) where 262 | type Predicate c :: Bool 263 | type Args c :: [Type] 264 | fromBool :: (Predicate c ~ 'True) => HVec (Args c) -> c 265 | 266 | fromBool' :: forall proxy c. (KnownTypeList (Args c), FromBool c, Predicate c ~ 'True) => proxy c -> Args c :~> c 267 | fromBool' pxyc = applyNAry' (Proxy :: Proxy (Args c)) pxyc fromBool 268 | -------------------------------------------------------------------------------- /Proof/Propositional.hs: -------------------------------------------------------------------------------- 1 | {-# LANGUAGE DataKinds #-} 2 | {-# LANGUAGE DeriveDataTypeable #-} 3 | {-# LANGUAGE EmptyCase #-} 4 | {-# LANGUAGE ExplicitForAll #-} 5 | {-# LANGUAGE ExplicitNamespaces #-} 6 | {-# LANGUAGE FlexibleInstances #-} 7 | {-# LANGUAGE GADTs #-} 8 | {-# LANGUAGE KindSignatures #-} 9 | {-# LANGUAGE LambdaCase #-} 10 | {-# LANGUAGE PolyKinds #-} 11 | {-# LANGUAGE RankNTypes #-} 12 | {-# LANGUAGE ScopedTypeVariables #-} 13 | {-# LANGUAGE StandaloneDeriving #-} 14 | {-# LANGUAGE TemplateHaskell #-} 15 | {-# LANGUAGE TypeOperators #-} 16 | {-# OPTIONS_GHC -fno-warn-orphans #-} 17 | 18 | -- | Provides type synonyms for logical connectives. 19 | module Proof.Propositional ( 20 | type (/\), 21 | type (\/), 22 | Not, 23 | exfalso, 24 | orIntroL, 25 | orIntroR, 26 | orElim, 27 | andIntro, 28 | andElimL, 29 | andElimR, 30 | orAssocL, 31 | orAssocR, 32 | andAssocL, 33 | andAssocR, 34 | IsTrue (..), 35 | withWitness, 36 | Empty (..), 37 | withEmpty, 38 | withEmpty', 39 | refute, 40 | Inhabited (..), 41 | withInhabited, 42 | prove, 43 | ) where 44 | 45 | import Data.Data (Data) 46 | import Data.Type.Equality (gcastWith, (:~:) (..)) 47 | import Data.Typeable (Typeable) 48 | import Data.Void 49 | import Proof.Propositional.Empty 50 | import Proof.Propositional.Inhabited 51 | import Proof.Propositional.TH 52 | import Unsafe.Coerce 53 | 54 | type a /\ b = (a, b) 55 | 56 | type a \/ b = Either a b 57 | 58 | type Not a = a -> Void 59 | 60 | infixr 2 \/ 61 | 62 | infixr 3 /\ 63 | 64 | exfalso :: a -> Not a -> b 65 | exfalso a neg = absurd (neg a) 66 | 67 | orIntroL :: a -> a \/ b 68 | orIntroL = Left 69 | 70 | orIntroR :: b -> a \/ b 71 | orIntroR = Right 72 | 73 | orElim :: a \/ b -> (a -> c) -> (b -> c) -> c 74 | orElim aORb aTOc bTOc = either aTOc bTOc aORb 75 | 76 | andIntro :: a -> b -> a /\ b 77 | andIntro = (,) 78 | 79 | andElimL :: a /\ b -> a 80 | andElimL = fst 81 | 82 | andElimR :: a /\ b -> b 83 | andElimR = snd 84 | 85 | andAssocL :: a /\ (b /\ c) -> (a /\ b) /\ c 86 | andAssocL (a, (b, c)) = ((a, b), c) 87 | 88 | andAssocR :: (a /\ b) /\ c -> a /\ (b /\ c) 89 | andAssocR ((a, b), c) = (a, (b, c)) 90 | 91 | orAssocL :: a \/ (b \/ c) -> (a \/ b) \/ c 92 | orAssocL (Left a) = Left (Left a) 93 | orAssocL (Right (Left b)) = Left (Right b) 94 | orAssocL (Right (Right c)) = Right c 95 | 96 | orAssocR :: (a \/ b) \/ c -> a \/ (b \/ c) 97 | orAssocR (Left (Left a)) = Left a 98 | orAssocR (Left (Right b)) = Right (Left b) 99 | orAssocR (Right c) = Right (Right c) 100 | 101 | {- | Utility type to convert type-level (@'Bool'@-valued) predicate function 102 | into concrete witness data-type. 103 | -} 104 | data IsTrue (b :: Bool) where 105 | Witness :: IsTrue 'True 106 | 107 | withWitness :: forall b r. IsTrue b -> ((b ~ 'True) => r) -> r 108 | withWitness _ = gcastWith (unsafeCoerce (Refl :: () :~: ()) :: b :~: 'True) 109 | {-# NOINLINE withWitness #-} 110 | 111 | deriving instance Show (IsTrue b) 112 | 113 | deriving instance Eq (IsTrue b) 114 | 115 | deriving instance Ord (IsTrue b) 116 | 117 | deriving instance Read (IsTrue 'True) 118 | 119 | deriving instance Typeable IsTrue 120 | 121 | deriving instance Data (IsTrue 'True) 122 | 123 | instance {-# OVERLAPPABLE #-} (Inhabited a, Empty b) => Empty (a -> b) where 124 | eliminate f = eliminate (f trivial) 125 | 126 | refute [t|0 :~: 1|] 127 | refute [t|() :~: Int|] 128 | refute [t|'True :~: 'False|] 129 | refute [t|'False :~: 'True|] 130 | refute [t|'LT :~: 'GT|] 131 | refute [t|'LT :~: 'EQ|] 132 | refute [t|'EQ :~: 'LT|] 133 | refute [t|'EQ :~: 'GT|] 134 | refute [t|'GT :~: 'LT|] 135 | refute [t|'GT :~: 'EQ|] 136 | 137 | prove [t|Bool|] 138 | prove [t|Int|] 139 | prove [t|Integer|] 140 | prove [t|Word|] 141 | prove [t|Double|] 142 | prove [t|Float|] 143 | prove [t|Char|] 144 | prove [t|Ordering|] 145 | prove [t|forall a. [a]|] 146 | prove [t|Rational|] 147 | prove [t|forall a. Maybe a|] 148 | prove [t|forall n. n :~: n|] 149 | prove [t|IsTrue 'True|] 150 | 151 | instance Empty (IsTrue 'False) where 152 | eliminate = \case {} 153 | -------------------------------------------------------------------------------- /Proof/Propositional/Empty.hs: -------------------------------------------------------------------------------- 1 | {-# LANGUAGE DataKinds #-} 2 | {-# LANGUAGE DefaultSignatures #-} 3 | {-# LANGUAGE DeriveAnyClass #-} 4 | {-# LANGUAGE EmptyCase #-} 5 | {-# LANGUAGE ExplicitNamespaces #-} 6 | {-# LANGUAGE FlexibleContexts #-} 7 | {-# LANGUAGE FlexibleInstances #-} 8 | {-# LANGUAGE GADTs #-} 9 | {-# LANGUAGE KindSignatures #-} 10 | {-# LANGUAGE LambdaCase #-} 11 | {-# LANGUAGE PolyKinds #-} 12 | {-# LANGUAGE RankNTypes #-} 13 | {-# LANGUAGE ScopedTypeVariables #-} 14 | {-# LANGUAGE StandaloneDeriving #-} 15 | {-# LANGUAGE TupleSections #-} 16 | {-# LANGUAGE TypeOperators #-} 17 | 18 | module Proof.Propositional.Empty (Empty (..), withEmpty, withEmpty') where 19 | 20 | import Data.Void (Void, absurd) 21 | import GHC.Generics 22 | import Unsafe.Coerce (unsafeCoerce) 23 | 24 | {- | Type-class for types without inhabitants, dual to @'Proof.Propositional.Inhabited'@. 25 | Current GHC doesn't provide selective-instance, 26 | hence we don't @'Empty'@ provide instances 27 | for product types in a generic deriving (DeriveAnyClass). 28 | 29 | To derive an instance for each concrete types, 30 | use @'Proof.Propositional.refute'@. 31 | 32 | Since 0.4.0.0. 33 | -} 34 | class Empty a where 35 | eliminate :: a -> x 36 | default eliminate :: (Generic a, GEmpty (Rep a)) => a -> x 37 | eliminate = geliminate . from 38 | 39 | class GEmpty f where 40 | geliminate :: f a -> x 41 | 42 | instance (GEmpty f) => GEmpty (M1 i t f) where 43 | geliminate (M1 a) = geliminate a 44 | 45 | instance (GEmpty f, GEmpty g) => GEmpty (f :+: g) where 46 | geliminate (L1 a) = geliminate a 47 | geliminate (R1 b) = geliminate b 48 | 49 | instance (Empty c) => GEmpty (K1 i c) where 50 | geliminate (K1 a) = eliminate a 51 | 52 | instance GEmpty V1 where 53 | geliminate = \case {} 54 | 55 | deriving instance (Empty a, Empty b) => Empty (Either a b) 56 | 57 | deriving instance Empty Void 58 | 59 | newtype MagicEmpty e a = MagicEmpty ((Empty e) => a) 60 | 61 | {- | Giving falsity witness by proving @'Void'@ from @a@. 62 | See also 'withEmpty''. 63 | 64 | Since 0.4.0.0 65 | -} 66 | withEmpty :: forall a b. (a -> Void) -> ((Empty a) => b) -> b 67 | withEmpty neg k = unsafeCoerce (MagicEmpty k :: MagicEmpty a b) (absurd . neg) 68 | 69 | {- | Giving falsity witness by showing @a@ entails everything. 70 | See also 'withEmpty'. 71 | 72 | Since 0.4.0.0 73 | -} 74 | withEmpty' :: forall a b. (forall c. a -> c) -> ((Empty a) => b) -> b 75 | withEmpty' neg k = unsafeCoerce (MagicEmpty k :: MagicEmpty a b) neg 76 | -------------------------------------------------------------------------------- /Proof/Propositional/Inhabited.hs: -------------------------------------------------------------------------------- 1 | {-# LANGUAGE DataKinds #-} 2 | {-# LANGUAGE DefaultSignatures #-} 3 | {-# LANGUAGE DeriveAnyClass #-} 4 | {-# LANGUAGE EmptyCase #-} 5 | {-# LANGUAGE ExplicitNamespaces #-} 6 | {-# LANGUAGE FlexibleContexts #-} 7 | {-# LANGUAGE FlexibleInstances #-} 8 | {-# LANGUAGE GADTs #-} 9 | {-# LANGUAGE KindSignatures #-} 10 | {-# LANGUAGE LambdaCase #-} 11 | {-# LANGUAGE PolyKinds #-} 12 | {-# LANGUAGE RankNTypes #-} 13 | {-# LANGUAGE ScopedTypeVariables #-} 14 | {-# LANGUAGE StandaloneDeriving #-} 15 | {-# LANGUAGE TupleSections #-} 16 | {-# LANGUAGE TypeOperators #-} 17 | 18 | module Proof.Propositional.Inhabited (Inhabited (..), withInhabited) where 19 | 20 | import GHC.Generics 21 | import Unsafe.Coerce (unsafeCoerce) 22 | 23 | {- | Types with at least one inhabitant, dual to @'Proof.Propositional.Empty'@. 24 | Currently, GHC doesn't provide a selective-instance, 25 | hence we can't generically derive @'Inhabited'@ instances 26 | for sum types (i.e. by @DeriveAnyClass@). 27 | 28 | To derive an instance for each concrete types, 29 | use @'Proof.Propositional.prove'@. 30 | 31 | Since 0.4.0.0. 32 | -} 33 | class Inhabited a where 34 | -- | A /generic/ inhabitant of type @'a'@, which means that 35 | -- one cannot assume anything about the value of @'trivial'@ 36 | -- except that it 37 | -- 38 | -- * is of type @a@, and 39 | -- * doesn't contain any partial values. 40 | trivial :: a 41 | default trivial :: (Generic a, GInhabited (Rep a)) => a 42 | trivial = to gtrivial 43 | 44 | class GInhabited f where 45 | gtrivial :: f a 46 | 47 | instance (GInhabited f) => GInhabited (M1 i t f) where 48 | gtrivial = M1 gtrivial 49 | 50 | instance (GInhabited f, GInhabited g) => GInhabited (f :*: g) where 51 | gtrivial = gtrivial :*: gtrivial 52 | 53 | instance (Inhabited c) => GInhabited (K1 i c) where 54 | gtrivial = K1 trivial 55 | 56 | instance GInhabited U1 where 57 | gtrivial = U1 58 | 59 | deriving instance Inhabited () 60 | 61 | deriving instance (Inhabited a, Inhabited b) => Inhabited (a, b) 62 | 63 | deriving instance (Inhabited a, Inhabited b, Inhabited c) => Inhabited (a, b, c) 64 | 65 | deriving instance (Inhabited a, Inhabited b, Inhabited c, Inhabited d) => Inhabited (a, b, c, d) 66 | 67 | instance (Inhabited b) => Inhabited (a -> b) where 68 | trivial = const trivial 69 | 70 | newtype MagicInhabited a b = MagicInhabited ((Inhabited a) => b) 71 | 72 | withInhabited :: forall a b. a -> ((Inhabited a) => b) -> b 73 | withInhabited wit k = unsafeCoerce (MagicInhabited k :: MagicInhabited a b) wit 74 | -------------------------------------------------------------------------------- /Proof/Propositional/TH.hs: -------------------------------------------------------------------------------- 1 | {-# LANGUAGE CPP #-} 2 | {-# LANGUAGE ExplicitNamespaces #-} 3 | {-# LANGUAGE MultiWayIf #-} 4 | {-# LANGUAGE PatternGuards #-} 5 | {-# LANGUAGE TemplateHaskell #-} 6 | {-# LANGUAGE TupleSections #-} 7 | {-# LANGUAGE ViewPatterns #-} 8 | 9 | module Proof.Propositional.TH where 10 | 11 | import Control.Arrow (Kleisli (..), second) 12 | import Control.Monad (forM, zipWithM) 13 | import Data.Foldable (asum) 14 | import Data.Functor (void) 15 | import Data.Map (Map) 16 | import qualified Data.Map as M 17 | import Data.Maybe (fromJust) 18 | import Data.Type.Equality ((:~:) (..)) 19 | import Language.Haskell.TH ( 20 | DecsQ, 21 | Lit (CharL, IntegerL), 22 | Name, 23 | Q, 24 | TypeQ, 25 | isInstance, 26 | newName, 27 | ppr, 28 | ) 29 | import Language.Haskell.TH.Desugar (DClause (..), DCon (..), DConFields (..), DCxt, DDec (..), DExp (..), DForallTelescope (..), DInfo (..), DLetDec (DFunD), DPat (DConP, DVarP), DPred, DTyVarBndr (..), DType (..), Overlap (Overlapping), desugar, dsReify, expandType, substTy, sweeten) 30 | import Proof.Propositional.Empty 31 | import Proof.Propositional.Inhabited 32 | 33 | #if MIN_VERSION_th_desugar(1,18,0) 34 | import Language.Haskell.TH.Desugar (dLamE, dCaseE) 35 | #else 36 | import Language.Haskell.TH.Desugar (DMatch) 37 | #endif 38 | 39 | mkDInstanceD :: 40 | Maybe Overlap -> 41 | DCxt -> 42 | DType -> 43 | [DDec] -> 44 | DDec 45 | mkDInstanceD ovl ctx dtype ddecs = DInstanceD ovl Nothing ctx dtype ddecs 46 | 47 | {- | Macro to automatically derive @'Empty'@ instance for 48 | concrete (variable-free) types which may contain products. 49 | -} 50 | refute :: TypeQ -> DecsQ 51 | refute tps = do 52 | tp <- expandType =<< desugar =<< tps 53 | let Just (_, tyName, args) = splitType tp 54 | mkInst dxt cls = 55 | return $ 56 | sweeten 57 | [ mkDInstanceD 58 | (Just Overlapping) 59 | dxt 60 | (DAppT (DConT ''Empty) (foldl DAppT (DConT tyName) args)) 61 | [DLetDec $ DFunD 'eliminate cls] 62 | ] 63 | if tyName == ''(:~:) 64 | then do 65 | let [l, r] = args 66 | v <- newName "_v" 67 | dist <- compareType l r 68 | case dist of 69 | NonEqual -> mkInst [] [DClause [] $ dLamE' [v] (dCaseE (DVarE v) [])] 70 | Equal -> fail $ "Equal: " ++ show (ppr $ sweeten l) ++ " ~ " ++ show (ppr $ sweeten r) 71 | Undecidable -> 72 | fail $ 73 | "No enough info to check non-equality: " 74 | ++ show (ppr $ sweeten l) 75 | ++ " ~ " 76 | ++ show (ppr $ sweeten r) 77 | else do 78 | (dxt, cons) <- resolveSubsts args . fromJust =<< dsReify tyName 79 | Just cls <- sequence <$> mapM buildRefuteClause cons 80 | mkInst dxt cls 81 | 82 | #if !MIN_VERSION_th_desugar(1,18,0) 83 | dCaseE :: DExp -> [DMatch] -> DExp 84 | dCaseE = DCaseE 85 | #endif 86 | 87 | dLamE' :: [Name] -> DExp -> DExp 88 | #if MIN_VERSION_th_desugar(1,18,0) 89 | dLamE' = dLamE . map DVarP 90 | #else 91 | dLamE' = DLamE 92 | #endif 93 | 94 | {- | Macro to automatically derive @'Inhabited'@ instance for 95 | concrete (variable-free) types which may contain sums. 96 | -} 97 | prove :: TypeQ -> DecsQ 98 | prove tps = do 99 | tp <- expandType =<< desugar =<< tps 100 | let Just (_, tyName, args) = splitType tp 101 | mkInst dxt cls = 102 | return $ 103 | sweeten 104 | [ mkDInstanceD 105 | (Just Overlapping) 106 | dxt 107 | (DAppT (DConT ''Inhabited) (foldl DAppT (DConT tyName) args)) 108 | [DLetDec $ DFunD 'trivial cls] 109 | ] 110 | isNum <- isInstance ''Num [sweeten tp] 111 | 112 | if 113 | | isNum -> mkInst [] [DClause [] $ DLitE $ IntegerL 0] 114 | | tyName == ''Char -> mkInst [] [DClause [] $ DLitE $ CharL '\NUL'] 115 | | tyName == ''(:~:) -> do 116 | let [l, r] = args 117 | dist <- compareType l r 118 | case dist of 119 | NonEqual -> fail $ "Equal: " ++ show (ppr $ sweeten l) ++ " ~ " ++ show (ppr $ sweeten r) 120 | Equal -> mkInst [] [DClause [] $ DConE 'Refl] 121 | Undecidable -> 122 | fail $ 123 | "No enough info to check non-equality: " 124 | ++ show (ppr $ sweeten l) 125 | ++ " ~ " 126 | ++ show (ppr $ sweeten r) 127 | | otherwise -> do 128 | (dxt, cons) <- resolveSubsts args . fromJust =<< dsReify tyName 129 | Just cls <- asum <$> mapM buildProveClause cons 130 | mkInst dxt [cls] 131 | 132 | buildClause :: 133 | Name -> 134 | (DType -> Q b) -> 135 | (DType -> b -> DExp) -> 136 | (Name -> [Maybe DExp] -> Maybe DExp) -> 137 | (Name -> [b] -> [DPat]) -> 138 | DCon -> 139 | Q (Maybe DClause) 140 | buildClause clsName genPlaceHolder buildFactor flattenExps toPats (DCon _ _ cName flds _) = do 141 | let tys = fieldsVars flds 142 | varDic <- mapM genPlaceHolder tys 143 | fmap (DClause $ toPats cName varDic) . flattenExps cName <$> zipWithM tryProc tys varDic 144 | where 145 | tryProc ty name = do 146 | isEmpty <- isInstance clsName . (: []) $ sweeten ty 147 | return $ 148 | if isEmpty 149 | then Just $ buildFactor ty name 150 | else Nothing 151 | 152 | buildRefuteClause :: DCon -> Q (Maybe DClause) 153 | buildRefuteClause = 154 | buildClause 155 | ''Empty 156 | (const $ newName "_x") 157 | (const $ (DVarE 'eliminate `DAppE`) . DVarE) 158 | (const asum) 159 | (\cName ps -> [DConP cName [] $ map DVarP ps]) 160 | 161 | buildProveClause :: DCon -> Q (Maybe DClause) 162 | buildProveClause = 163 | buildClause 164 | ''Inhabited 165 | (const $ return ()) 166 | (const $ const $ DVarE 'trivial) 167 | (\con args -> foldl DAppE (DConE con) <$> sequence args) 168 | (const $ const []) 169 | 170 | fieldsVars :: DConFields -> [DType] 171 | fieldsVars (DNormalC _ fs) = map snd fs 172 | fieldsVars (DRecC fs) = map (\(_, _, c) -> c) fs 173 | 174 | resolveSubsts :: [DType] -> DInfo -> Q (DCxt, [DCon]) 175 | resolveSubsts args info = 176 | case info of 177 | DTyConI (DDataD _ cxt _ tvbs _ dcons _) _ -> do 178 | let dic = M.fromList $ zip (map dtvbToName tvbs) args 179 | (cxt,) <$> mapM (substDCon dic) dcons 180 | -- (DTyConI (DOpenTypeFamilyD n) _) -> return [] 181 | -- (DTyConI (DClosedTypeFamilyD _ ddec2) minst) -> return [] 182 | -- (DTyConI (DDataFamilyD _ ddec2) minst) -> return [] 183 | -- (DTyConI (DDataInstD _ ddec2 ddec3 ddec4 ddec5 ddec6) minst) -> return [] 184 | (DTyConI _ _) -> fail "Not supported data ty" 185 | _ -> fail "Please pass data-type" 186 | 187 | type SubstDic = Map Name DType 188 | 189 | substDCon :: SubstDic -> DCon -> Q DCon 190 | substDCon dic (DCon forall'd cxt conName fields mPhantom) = 191 | DCon forall'd cxt conName 192 | <$> substFields dic fields 193 | <*> substTy dic mPhantom 194 | 195 | substFields :: SubstDic -> DConFields -> Q DConFields 196 | substFields 197 | subst 198 | (DNormalC fixi fs) = 199 | DNormalC fixi 200 | <$> mapM (runKleisli $ second $ Kleisli $ substTy subst) fs 201 | substFields subst (DRecC fs) = 202 | DRecC <$> forM fs (\(a, b, c) -> (a,b,) <$> substTy subst c) 203 | 204 | splitType :: DType -> Maybe ([Name], Name, [DType]) 205 | splitType (DConstrainedT _ t) = splitType t 206 | splitType (DForallT (unTelescope -> vs) t) = 207 | (\(a, b, c) -> (map dtvbToName vs ++ a, b, c)) <$> splitType t 208 | splitType (DAppT t1 t2) = (\(a, b, c) -> (a, b, c ++ [t2])) <$> splitType t1 209 | splitType (DSigT t _) = splitType t 210 | splitType (DVarT _) = Nothing 211 | splitType (DConT n) = Just ([], n, []) 212 | splitType DArrowT = Just ([], ''(->), []) 213 | splitType (DLitT _) = Nothing 214 | splitType DWildCardT = Nothing 215 | splitType (DAppKindT _ _) = Nothing 216 | 217 | data EqlJudge = NonEqual | Undecidable | Equal 218 | deriving (Read, Show, Eq, Ord) 219 | 220 | instance Semigroup EqlJudge where 221 | NonEqual <> _ = NonEqual 222 | Undecidable <> NonEqual = NonEqual 223 | Undecidable <> _ = Undecidable 224 | Equal <> m = m 225 | 226 | instance Monoid EqlJudge where 227 | mappend = (<>) 228 | mempty = Equal 229 | 230 | compareType :: DType -> DType -> Q EqlJudge 231 | compareType t0 s0 = do 232 | t <- expandType t0 233 | s <- expandType s0 234 | compareType' t s 235 | 236 | compareType' :: DType -> DType -> Q EqlJudge 237 | compareType' (DSigT t1 t2) (DSigT s1 s2) = 238 | (<>) <$> compareType' t1 s1 <*> compareType' t2 s2 239 | compareType' (DSigT t _) s = 240 | compareType' t s 241 | compareType' t (DSigT s _) = 242 | compareType' t s 243 | compareType' (DVarT t) (DVarT s) 244 | | t == s = return Equal 245 | | otherwise = return Undecidable 246 | compareType' (DVarT _) _ = return Undecidable 247 | compareType' _ (DVarT _) = return Undecidable 248 | compareType' DWildCardT _ = return Undecidable 249 | compareType' _ DWildCardT = return Undecidable 250 | compareType' (DConstrainedT tCxt t) (DConstrainedT sCxt s) = do 251 | pd <- compareCxt tCxt sCxt 252 | bd <- compareType' t s 253 | return (pd <> bd) 254 | compareType' DConstrainedT {} _ = return NonEqual 255 | compareType' (DForallT (unTelescope -> tTvBs) t) (DForallT (unTelescope -> sTvBs) s) 256 | | length tTvBs == length sTvBs = do 257 | let dic = M.fromList $ zip (map dtvbToName sTvBs) (map (DVarT . dtvbToName) tTvBs) 258 | s' <- substTy dic s 259 | bd <- compareType' t s' 260 | return bd 261 | | otherwise = return NonEqual 262 | compareType' DForallT {} _ = return NonEqual 263 | compareType' (DAppT t1 t2) (DAppT s1 s2) = 264 | (<>) <$> compareType' t1 s1 <*> compareType' t2 s2 265 | compareType' (DConT t) (DConT s) 266 | | t == s = return Equal 267 | | otherwise = return NonEqual 268 | compareType' (DConT _) _ = return NonEqual 269 | compareType' DArrowT DArrowT = return Equal 270 | compareType' DArrowT _ = return NonEqual 271 | compareType' (DLitT t) (DLitT s) 272 | | t == s = return Equal 273 | | otherwise = return NonEqual 274 | compareType' (DLitT _) _ = return NonEqual 275 | compareType' _ _ = return NonEqual 276 | 277 | compareCxt :: DCxt -> DCxt -> Q EqlJudge 278 | compareCxt l r = mconcat <$> zipWithM comparePred l r 279 | 280 | comparePred :: DPred -> DPred -> Q EqlJudge 281 | comparePred DWildCardT _ = return Undecidable 282 | comparePred _ DWildCardT = return Undecidable 283 | comparePred (DVarT l) (DVarT r) 284 | | l == r = return Equal 285 | comparePred (DVarT _) _ = return Undecidable 286 | comparePred _ (DVarT _) = return Undecidable 287 | comparePred (DSigT l t) (DSigT r s) = 288 | (<>) <$> compareType' t s <*> comparePred l r 289 | comparePred (DSigT l _) r = comparePred l r 290 | comparePred l (DSigT r _) = comparePred l r 291 | comparePred (DAppT l1 l2) (DAppT r1 r2) = do 292 | l2' <- expandType l2 293 | r2' <- expandType r2 294 | (<>) <$> comparePred l1 r1 <*> compareType' l2' r2' 295 | comparePred (DAppT _ _) _ = return NonEqual 296 | comparePred (DConT l) (DConT r) 297 | | l == r = return Equal 298 | | otherwise = return NonEqual 299 | comparePred (DConT _) _ = return NonEqual 300 | comparePred (DForallT _ _) (DForallT _ _) = return Undecidable 301 | comparePred (DForallT {}) _ = return NonEqual 302 | comparePred _ _ = fail "Kind error: Expecting type-level predicate" 303 | 304 | substPred :: SubstDic -> DPred -> Q DPred 305 | substPred dic (DAppT p1 p2) = DAppT <$> substPred dic p1 <*> (expandType =<< substTy dic p2) 306 | substPred dic (DSigT p knd) = DSigT <$> substPred dic p <*> (expandType =<< substTy dic knd) 307 | substPred dic prd@(DVarT p) 308 | | Just (DVarT t) <- M.lookup p dic = return $ DVarT t 309 | | Just (DConT t) <- M.lookup p dic = return $ DConT t 310 | | otherwise = return prd 311 | substPred _ t = return t 312 | 313 | dtvbToName :: DTyVarBndr flag -> Name 314 | dtvbToName (DPlainTV n _) = n 315 | dtvbToName (DKindedTV n _ _) = n 316 | 317 | unTelescope :: DForallTelescope -> [DTyVarBndr ()] 318 | unTelescope (DForallVis vis) = map void vis 319 | unTelescope (DForallInvis vis) = map void vis 320 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Agda-style Equational Reasoning in Haskell by Data Kinds 2 | ========================================================= 3 | [![Build Status](https://travis-ci.org/konn/equational-reasoning-in-haskell.svg)](https://travis-ci.org/konn/equational-reasoning-in-haskell) [![Hackage](https://img.shields.io/hackage/v/equational-reasoning.svg)](https://hackage.haskell.org/package/equational-reasoning) 4 | 5 | What is this? 6 | -------------- 7 | This library provides means to prove equations in Haskell. 8 | You can prove equations in Agda's EqReasoning like style. 9 | 10 | See blow for an example: 11 | 12 | ```haskell 13 | plusZeroL :: SNat m -> Zero :+: m :=: m 14 | plusZeroL SZero = Refl 15 | plusZeroL (SSucc m) = 16 | start (SZero %+ (SSucc m)) 17 | === SSucc (SZero %+ m) `because` plusSuccR SZero m 18 | === SSucc m `because` succCongEq (plusZeroL m) 19 | 20 | ``` 21 | 22 | It also provides some utility functions to use an induction. 23 | 24 | For more detail, please read source codes! 25 | 26 | 27 | TODOs 28 | ------ 29 | 30 | * Automatic generation for induction schema for any inductive types. 31 | -------------------------------------------------------------------------------- /Setup.hs: -------------------------------------------------------------------------------- 1 | import Distribution.Simple 2 | main = defaultMain 3 | -------------------------------------------------------------------------------- /cabal.project: -------------------------------------------------------------------------------- 1 | packages: *.cabal 2 | -------------------------------------------------------------------------------- /ci-configs/cabal.project: -------------------------------------------------------------------------------- 1 | ../cabal.project -------------------------------------------------------------------------------- /ci-configs/ghc-9.10.1.config: -------------------------------------------------------------------------------- 1 | -- NOTE: Due to revisions, this file may not work. See: 2 | -- https://github.com/fpco/stackage-server/issues/232 3 | 4 | -- Stackage snapshot from: http://www.stackage.org/snapshot/nightly-2025-01-01 5 | -- Please place this file next to your .cabal file as cabal.config 6 | -- To only use tested packages, uncomment the following line: 7 | -- remote-repo: stackage-nightly-2025-01-01:http://www.stackage.org/nightly-2025-01-01 8 | import: cabal.project 9 | with-compiler: ghc-9.10.1 10 | constraints: abstract-deque ==0.3, 11 | abstract-deque-tests ==0.3, 12 | abstract-par ==0.3.3, 13 | AC-Angle ==1.0, 14 | acc ==0.2.0.3, 15 | ace ==0.6, 16 | acid-state ==0.16.1.3, 17 | action-permutations ==0.0.0.1, 18 | active ==0.2.1, 19 | ad ==4.5.6, 20 | ad-delcont ==0.5.0.0, 21 | adjunctions ==4.4.2, 22 | adler32 ==0.1.2.0, 23 | advent-of-code-api ==0.2.9.1, 24 | aern2-mp ==0.2.16.1, 25 | aern2-real ==0.2.16.1, 26 | aeson ==2.2.3.0, 27 | aeson-attoparsec ==0.0.0, 28 | aeson-casing ==0.2.0.0, 29 | aeson-combinators ==0.1.2.1, 30 | aeson-diff ==1.1.0.13, 31 | aeson-generic-compat ==0.0.2.0, 32 | aeson-pretty ==0.8.10, 33 | aeson-qq ==0.8.4, 34 | aeson-typescript ==0.6.4.0, 35 | aeson-unqualified-ast ==1.0.0.3, 36 | aeson-value-parser ==0.19.7.2, 37 | aeson-yak ==0.1.1.3, 38 | aeson-yaml ==1.1.0.1, 39 | Agda ==2.7.0.1, 40 | agda2lagda ==0.2023.6.9, 41 | agreeing ==0.2.2.0, 42 | alarmclock ==0.7.0.7, 43 | alex ==3.5.2.0, 44 | alex-meta ==0.3.0.13, 45 | alex-tools ==0.6.1, 46 | alfred-margaret ==2.1.0.2, 47 | algebra ==4.3.1, 48 | algebraic-graphs ==0.7, 49 | align-audio ==0.0.0.1, 50 | almost-fix ==0.0.2, 51 | alsa-core ==0.5.0.1, 52 | alsa-mixer ==0.3.0.1, 53 | alsa-pcm ==0.6.1.1, 54 | alsa-seq ==0.6.0.9, 55 | alternative-vector ==0.0.0, 56 | alternators ==1.0.0.0, 57 | ALUT ==2.4.0.3, 58 | amqp ==0.24.0, 59 | annotated-exception ==0.3.0.2, 60 | annotated-wl-pprint ==0.7.0, 61 | ansi-terminal ==1.1.2, 62 | ansi-terminal-game ==1.9.3.0, 63 | ansi-terminal-types ==1.1, 64 | ansi-wl-pprint ==1.0.2, 65 | ANum ==0.2.0.2, 66 | apecs ==0.9.6, 67 | apecs-gloss ==0.2.4, 68 | apecs-physics ==0.4.6, 69 | api-field-json-th ==0.1.0.2, 70 | ap-normalize ==0.1.0.1, 71 | appar ==0.1.8, 72 | appendful ==0.1.0.0, 73 | appendful-persistent ==0.1.0.1, 74 | appendmap ==0.1.5, 75 | apply-merge ==0.1.1.0, 76 | apportionment ==0.0.0.4, 77 | approximate ==0.3.5, 78 | approximate-equality ==1.1.0.2, 79 | arithmoi ==0.13.0.0, 80 | array installed, 81 | array-memoize ==0.6.0, 82 | arrow-extras ==0.1.0.1, 83 | arrows ==0.4.4.2, 84 | ascii-progress ==0.3.3.0, 85 | asn1-encoding ==0.9.6, 86 | asn1-parse ==0.9.5, 87 | asn1-types ==0.3.4, 88 | assert-failure ==0.1.3.0, 89 | assignment ==0.0.1.0, 90 | assoc ==1.1.1, 91 | astro ==0.4.3.0, 92 | async ==2.2.5, 93 | async-extra ==0.2.0.0, 94 | async-pool ==0.9.2, 95 | async-refresh ==0.3.0.0, 96 | async-refresh-tokens ==0.4.0.0, 97 | atom-basic ==0.2.5, 98 | atom-conduit ==0.9.0.1, 99 | atomic-counter ==0.1.2.3, 100 | atomic-primops ==0.8.8, 101 | attoparsec ==0.14.4, 102 | attoparsec-aeson ==2.2.2.0, 103 | attoparsec-base64 ==0.0.0, 104 | attoparsec-binary ==0.2, 105 | attoparsec-data ==1.0.5.4, 106 | attoparsec-expr ==0.1.1.2, 107 | attoparsec-framer ==0.1.0.9, 108 | attoparsec-iso8601 ==1.1.1.0, 109 | attoparsec-time ==1.0.3.1, 110 | attoparsec-uri ==0.0.9, 111 | audacity ==0.0.2.2, 112 | authenticate ==1.3.5.2, 113 | authenticate-oauth ==1.7, 114 | autodocodec ==0.4.2.2, 115 | autodocodec-nix ==0.0.1.5, 116 | autodocodec-schema ==0.2.0.0, 117 | autodocodec-servant-multipart ==0.0.0.1, 118 | autoexporter ==2.0.0.12, 119 | automaton ==1.5, 120 | auto-update ==0.2.6, 121 | avro ==0.6.2.1, 122 | aws-sns-verify ==0.0.0.3, 123 | aws-xray-client ==0.1.0.2, 124 | aws-xray-client-persistent ==0.1.0.5, 125 | aws-xray-client-wai ==0.1.0.2, 126 | backprop ==0.2.6.5, 127 | backtracking ==0.1.0, 128 | bank-holiday-germany ==1.3.0.0, 129 | bank-holidays-england ==0.2.0.11, 130 | barbies ==2.1.1.0, 131 | base installed, 132 | base16 ==1.0, 133 | base16-bytestring ==1.0.2.0, 134 | base32string ==0.9.1, 135 | base58-bytestring ==0.1.0, 136 | base58string ==0.10.0, 137 | base64 ==1.0, 138 | base64-bytestring ==1.2.1.0, 139 | base64-string ==0.2, 140 | base-compat ==0.14.1, 141 | base-compat-batteries ==0.14.1, 142 | basement ==0.0.16, 143 | base-orphans ==0.9.3, 144 | base-prelude ==1.6.1.1, 145 | base-unicode-symbols ==0.2.4.2, 146 | basic-prelude ==0.7.0, 147 | bazel-runfiles ==0.12, 148 | bbdb ==0.8, 149 | bcp47 ==0.2.0.6, 150 | bcp47-orphans ==0.1.0.6, 151 | bcrypt ==0.0.11, 152 | beam-core ==0.10.3.1, 153 | beam-migrate ==0.5.3.1, 154 | beam-postgres ==0.5.4.1, 155 | beam-sqlite ==0.5.3.0, 156 | bench ==1.0.13, 157 | benchpress ==0.2.2.25, 158 | bencode ==0.6.1.1, 159 | bencoding ==0.4.5.6, 160 | benri-hspec ==0.1.0.3, 161 | between ==0.11.0.0, 162 | bibtex ==0.1.0.7, 163 | bifunctor-classes-compat ==0.1, 164 | bifunctors ==5.6.2, 165 | bimap ==0.5.0, 166 | bimaps ==0.1.0.2, 167 | bin ==0.1.4, 168 | binance-exports ==0.1.2.0, 169 | binary installed, 170 | binary-conduit ==1.3.1, 171 | binaryen ==0.0.6.0, 172 | binary-generic-combinators ==0.4.4.0, 173 | binary-ieee754 ==0.1.0.0, 174 | binary-list ==1.1.1.2, 175 | binary-orphans ==1.0.5, 176 | binary-parser ==0.5.7.6, 177 | binary-search ==2.0.0, 178 | binary-shared ==0.8.3, 179 | bindings-DSL ==1.0.25, 180 | bindings-GLFW ==3.3.9.2, 181 | bindings-libzip ==1.0.1, 182 | bindings-uname ==0.1, 183 | BiobaseNewick ==0.0.0.2, 184 | bitarray ==0.0.1.1, 185 | bits ==0.6, 186 | bitset-word8 ==0.1.1.2, 187 | bits-extra ==0.0.2.3, 188 | bitvec ==1.1.5.0, 189 | bitwise ==1.0.0.1, 190 | bitwise-enum ==1.0.1.2, 191 | Blammo ==2.1.1.0, 192 | blank-canvas ==0.7.4, 193 | blas-carray ==0.1.0.2, 194 | blas-comfort-array ==0.0.0.3, 195 | blas-ffi ==0.1, 196 | blas-hs ==0.1.1.0, 197 | blaze-bootstrap ==0.1.0.1, 198 | blaze-builder ==0.4.2.3, 199 | blaze-colonnade ==1.2.3.0, 200 | blaze-html ==0.9.2.0, 201 | blaze-markup ==0.8.3.0, 202 | blaze-svg ==0.3.7, 203 | blaze-textual ==0.2.3.1, 204 | bloodhound ==0.23.0.0, 205 | bloomfilter ==2.0.1.2, 206 | bluefin ==0.0.14.0, 207 | bluefin-internal ==0.0.14.0, 208 | bm ==0.2.0.0, 209 | bmp ==1.2.6.4, 210 | BNFC ==2.9.5, 211 | BNFC-meta ==0.6.1, 212 | board-games ==0.4, 213 | bodhi ==0.1.0, 214 | boltzmann-samplers ==0.1.1.0, 215 | Boolean ==0.2.4, 216 | boolsimplifier ==0.1.8, 217 | boomwhacker ==0.0.2, 218 | bordacount ==0.1.0.0, 219 | boring ==0.2.2, 220 | bound ==2.0.7, 221 | BoundedChan ==1.0.3.0, 222 | bounded-queue ==1.0.0, 223 | boundingboxes ==0.2.3, 224 | box ==0.9.3.2, 225 | boxes ==0.1.5, 226 | box-socket ==0.5.2.0, 227 | breakpoint ==0.1.4.0, 228 | brick ==2.6, 229 | brotli ==0.0.0.2, 230 | brotli-streams ==0.0.0.0, 231 | bsb-http-chunked ==0.0.0.4, 232 | bson ==0.4.0.1, 233 | bson-lens ==0.1.1, 234 | btrfs ==0.2.1.0, 235 | buffer-pipe ==0.0, 236 | bugsnag ==1.1.0.1, 237 | bugsnag-hs ==0.2.0.12, 238 | bugsnag-wai ==1.0.0.1, 239 | bugsnag-yesod ==1.0.1.0, 240 | bugzilla-redhat ==1.0.1.1, 241 | burrito ==2.0.1.10, 242 | bv ==0.5, 243 | bv-sized ==1.0.5, 244 | byteable ==0.1.1, 245 | bytebuild ==0.3.16.3, 246 | byte-count-reader ==0.10.1.12, 247 | bytedump ==1.0, 248 | bytehash ==0.1.1.2, 249 | byte-order ==0.1.3.1, 250 | byteorder ==1.0.4, 251 | bytes ==0.17.4, 252 | byteset ==0.1.1.1, 253 | byteslice ==0.2.14.0, 254 | bytesmith ==0.3.11.1, 255 | bytestring installed, 256 | bytestring-builder ==0.10.8.2.0, 257 | bytestring-conversion ==0.3.2, 258 | bytestring-lexing ==0.5.0.14, 259 | bytestring-strict-builder ==0.4.5.7, 260 | bytestring-to-vector ==0.3.0.1, 261 | bytestring-tree-builder ==0.2.7.12, 262 | bytestring-trie ==0.2.7.5, 263 | bz2 ==1.0.1.2, 264 | bzip2-clib ==1.0.8, 265 | bzlib ==0.5.2.0, 266 | bzlib-conduit ==0.3.0.4, 267 | c14n ==0.1.0.3, 268 | c2hs ==0.28.8, 269 | Cabal installed, 270 | cabal2nix ==2.19.1, 271 | cabal2spec ==2.7.1, 272 | cabal-appimage ==0.4.0.5, 273 | cabal-clean ==0.2.20230609, 274 | cabal-debian ==5.2.5, 275 | cabal-doctest ==1.0.11, 276 | cabal-file ==0.1.1, 277 | cabal-fix ==0.1.0.0, 278 | cabal-flatpak ==0.1.2, 279 | cabal-gild ==1.5.0.1, 280 | cabal-plan ==0.7.4.0, 281 | cabal-rpm ==2.2.1, 282 | cabal-sort ==0.1.2, 283 | Cabal-syntax installed, 284 | cache ==0.1.3.0, 285 | cached-json-file ==0.1.1, 286 | cacophony ==0.10.1, 287 | cairo ==0.13.11.0, 288 | cairo-image ==0.1.0.4, 289 | calendar-recycling ==0.0.0.1, 290 | call-alloy ==0.5.0.1, 291 | call-plantuml ==0.0.1.3, 292 | call-stack ==0.4.0, 293 | can-i-haz ==0.3.1.1, 294 | capability ==0.5.0.1, 295 | ca-province-codes ==1.0.0.0, 296 | cardano-coin-selection ==1.0.1, 297 | carray ==0.1.6.8, 298 | casa-client ==0.0.2, 299 | casa-types ==0.0.2, 300 | cased ==0.1.0.0, 301 | case-insensitive ==1.2.1.0, 302 | cases ==0.1.4.3, 303 | casing ==0.1.4.1, 304 | cassava ==0.5.3.2, 305 | cassava-conduit ==0.6.6, 306 | cassava-megaparsec ==2.1.1, 307 | cast ==0.1.0.2, 308 | caster ==0.0.3.0, 309 | cayley-client ==0.4.19.4, 310 | cborg ==0.2.10.0, 311 | cborg-json ==0.2.6.0, 312 | cdar-mBound ==0.1.0.4, 313 | c-enum ==0.1.1.3, 314 | cereal ==0.5.8.3, 315 | cereal-conduit ==0.8.0, 316 | cereal-text ==0.1.0.2, 317 | cereal-unordered-containers ==0.1.0.1, 318 | cereal-vector ==0.2.0.1, 319 | cfenv ==0.1.0.0, 320 | cgi ==3001.5.0.1, 321 | chan ==0.0.4.1, 322 | ChannelT ==0.0.0.7, 323 | character-cases ==0.1.0.6, 324 | character-ps ==0.1, 325 | charset ==0.3.11, 326 | Chart ==1.9.5, 327 | Chart-cairo ==1.9.4.1, 328 | Chart-diagrams ==1.9.5.1, 329 | chart-svg ==0.8.0.0, 330 | ChasingBottoms ==1.3.1.15, 331 | check-email ==1.0.2, 332 | checkers ==0.6.0, 333 | checksum ==0.0.0.1, 334 | chell ==0.5.0.2, 335 | chell-hunit ==0.3.0.2, 336 | chimera ==0.4.1.0, 337 | choice ==0.2.4.1, 338 | chronologique ==0.3.1.3, 339 | chunked-data ==0.3.1, 340 | cipher-aes ==0.2.11, 341 | cipher-camellia ==0.0.2, 342 | cipher-rc4 ==0.1.4, 343 | circle-packing ==0.1.0.6, 344 | circular ==0.4.0.3, 345 | citeproc ==0.8.1.2, 346 | classy-prelude ==1.5.0.3, 347 | classy-prelude-conduit ==1.5.0, 348 | classy-prelude-yesod ==1.5.0, 349 | clay ==0.15.0, 350 | clientsession ==0.9.3.0, 351 | clock ==0.8.4, 352 | closed ==0.2.0.2, 353 | clumpiness ==0.17.0.2, 354 | ClustalParser ==1.3.0, 355 | cmark ==0.6.1, 356 | cmark-gfm ==0.2.6, 357 | cmark-lucid ==0.1.0.0, 358 | cmdargs ==0.10.22, 359 | codec-beam ==0.2.0, 360 | code-conjure ==0.5.14, 361 | code-page ==0.2.1, 362 | coinor-clp ==0.0.0.2, 363 | collect-errors ==0.1.6.0, 364 | co-log-core ==0.3.2.3, 365 | co-log-polysemy ==0.0.1.5, 366 | colonnade ==1.2.0.2, 367 | Color ==0.3.3, 368 | colorful-monoids ==0.2.1.3, 369 | colorize-haskell ==1.0.1, 370 | colour ==2.3.6, 371 | colourista ==0.1.0.2, 372 | columnar ==1.0.0.0, 373 | combinatorial ==0.1.1, 374 | comfort-array ==0.5.5, 375 | comfort-array-shape ==0.0, 376 | comfort-blas ==0.0.3, 377 | comfort-fftw ==0.0.0.1, 378 | comfort-glpk ==0.1, 379 | comfort-graph ==0.0.4, 380 | commonmark ==0.2.6.1, 381 | commonmark-extensions ==0.2.5.6, 382 | commonmark-pandoc ==0.2.2.3, 383 | commutative ==0.0.2, 384 | commutative-semigroups ==0.2.0.1, 385 | comonad ==5.0.9, 386 | compact ==0.2.0.0, 387 | compactmap ==0.1.4.5, 388 | companion ==0.1.0, 389 | compensated ==0.8.3, 390 | compiler-warnings ==0.1.0, 391 | componentm ==0.0.0.2, 392 | componentm-devel ==0.0.0.2, 393 | composable-associations ==0.1.0.0, 394 | composition ==1.0.2.2, 395 | composition-extra ==2.1.0, 396 | composition-prelude ==3.0.1.0, 397 | concise ==0.1.0.1, 398 | concurrency ==1.11.0.3, 399 | concurrent-extra ==0.7.0.12, 400 | concurrent-output ==1.10.21, 401 | concurrent-split ==0.0.1.1, 402 | cond ==0.5.1, 403 | conduino ==0.2.4.0, 404 | conduit ==1.3.6, 405 | conduit-aeson ==0.1.1.0, 406 | conduit-algorithms ==0.0.14.0, 407 | conduit-combinators ==1.3.0, 408 | conduit-concurrent-map ==0.1.3, 409 | conduit-extra ==1.3.6, 410 | conduit-parse ==0.2.1.1, 411 | conduit-zstd ==0.0.2.0, 412 | config-ini ==0.2.7.0, 413 | configuration-tools ==0.7.0, 414 | configurator ==0.3.0.0, 415 | configurator-export ==0.1.0.1, 416 | config-value ==0.8.3, 417 | constraints ==0.14.2, 418 | constraints-extras ==0.4.0.1, 419 | constraint-tuples ==0.2, 420 | containers installed, 421 | context ==0.2.1.0, 422 | context-http-client ==0.2.0.2, 423 | context-resource ==0.2.0.2, 424 | context-wai-middleware ==0.2.0.2, 425 | contiguous ==0.6.4.2, 426 | contravariant ==1.5.5, 427 | contravariant-extras ==0.3.5.4, 428 | control-bool ==0.2.1, 429 | control-dsl ==0.2.1.3, 430 | control-monad-free ==0.6.2, 431 | control-monad-omega ==0.3.3, 432 | convertible ==1.1.1.1, 433 | cookie ==0.5.0, 434 | copilot-core ==4.1, 435 | copilot-interpreter ==4.1, 436 | copilot-prettyprinter ==4.1, 437 | copr-api ==0.2.0, 438 | core-data ==0.3.9.1, 439 | core-program ==0.7.0.0, 440 | core-telemetry ==0.2.9.4, 441 | core-text ==0.3.8.1, 442 | countable ==1.2, 443 | country ==0.2.5.0, 444 | covariance ==0.2.0.1, 445 | cpphs ==1.20.9.1, 446 | cpu ==0.1.2, 447 | cql ==4.0.4, 448 | cql-io ==1.1.1, 449 | crackNum ==3.15, 450 | crc32c ==0.2.2, 451 | credential-store ==0.1.2, 452 | criterion ==1.6.4.0, 453 | criterion-measurement ==0.2.3.0, 454 | cron ==0.7.2, 455 | crypto-api ==0.13.3, 456 | crypto-api-tests ==0.3, 457 | crypto-cipher-tests ==0.0.11, 458 | crypto-cipher-types ==0.0.9, 459 | cryptocompare ==0.1.2, 460 | cryptohash ==0.11.9, 461 | cryptohash-cryptoapi ==0.1.4, 462 | cryptohash-md5 ==0.11.101.0, 463 | cryptohash-sha1 ==0.11.101.0, 464 | cryptohash-sha256 ==0.11.102.1, 465 | cryptohash-sha512 ==0.11.102.0, 466 | crypton ==1.0.1, 467 | crypton-conduit ==0.2.3, 468 | crypton-connection ==0.4.3, 469 | cryptonite ==0.30, 470 | cryptonite-conduit ==0.2.2, 471 | cryptonite-openssl ==0.7, 472 | crypton-x509 ==1.7.7, 473 | crypton-x509-store ==1.6.9, 474 | crypton-x509-system ==1.6.7, 475 | crypton-x509-validation ==1.6.13, 476 | crypto-pubkey-types ==0.4.3, 477 | crypto-random-api ==0.2.0, 478 | crypto-token ==0.1.2, 479 | csp ==1.4.0, 480 | css-text ==0.1.3.0, 481 | c-struct ==0.1.3.0, 482 | csv ==0.1.2, 483 | csv-conduit ==1.0.1.0, 484 | ctrie ==0.2, 485 | cubicbezier ==0.6.0.7, 486 | cubicspline ==0.1.2, 487 | cue-sheet ==2.0.2, 488 | curl ==1.3.8, 489 | currency ==0.2.0.0, 490 | cursor ==0.3.2.0, 491 | cursor-brick ==0.1.0.1, 492 | cursor-fuzzy-time ==0.1.0.0, 493 | cursor-gen ==0.4.0.0, 494 | cutter ==0.0, 495 | cyclotomic ==1.1.2, 496 | data-accessor ==0.2.3.1, 497 | data-accessor-mtl ==0.2.0.5, 498 | data-accessor-transformers ==0.2.1.8, 499 | data-array-byte ==0.1.0.1, 500 | data-binary-ieee754 ==0.4.4, 501 | data-bword ==0.1.0.2, 502 | data-checked ==0.3, 503 | data-clist ==0.2, 504 | data-compat ==0.1.0.5, 505 | data-default ==0.8.0.0, 506 | data-default-class ==0.2.0.0, 507 | data-diverse ==4.7.1.0, 508 | data-dword ==0.3.2.1, 509 | data-endian ==0.1.1, 510 | data-fix ==0.3.4, 511 | data-has ==0.4.0.0, 512 | data-hash ==0.2.0.1, 513 | data-interval ==2.1.2, 514 | data-inttrie ==0.1.4, 515 | data-lens-light ==0.1.2.4, 516 | data-memocombinators ==0.5.1, 517 | data-msgpack ==0.0.13, 518 | data-msgpack-types ==0.0.3, 519 | data-or ==1.0.0.7, 520 | data-ordlist ==0.4.7.0, 521 | data-ref ==0.1, 522 | data-reify ==0.6.4, 523 | data-serializer ==0.3.5, 524 | data-sketches ==0.3.1.0, 525 | data-sketches-core ==0.1.0.0, 526 | data-textual ==0.3.0.3, 527 | dataurl ==0.1.0.0, 528 | DAV ==1.3.4, 529 | dbcleaner ==0.1.3, 530 | DBFunctor ==0.1.2.1, 531 | dbus ==1.3.9, 532 | dbus-hslogger ==0.1.0.1, 533 | debian ==4.0.5, 534 | debian-build ==0.10.2.1, 535 | debug-trace-var ==0.2.0, 536 | dec ==0.0.6, 537 | decidable ==0.3.1.1, 538 | Decimal ==0.5.2, 539 | declarative ==0.5.4, 540 | deepseq installed, 541 | deepseq-generics ==0.2.0.0, 542 | deferred-folds ==0.9.18.6, 543 | dejafu ==2.4.0.6, 544 | dense-linear-algebra ==0.1.0.0, 545 | dependent-map ==0.4.0.0, 546 | dependent-sum ==0.7.2.0, 547 | dependent-sum-template ==0.2.0.1, 548 | depq ==0.4.2, 549 | deque ==0.4.4.1, 550 | deriveJsonNoPrefix ==0.1.0.1, 551 | derive-storable ==0.3.1.0, 552 | derive-topdown ==0.1.0.0, 553 | deriving-aeson ==0.2.10, 554 | deriving-compat ==0.6.7, 555 | deriving-trans ==0.9.1.0, 556 | detour-via-sci ==1.0.0, 557 | df1 ==0.4.3, 558 | di ==1.3, 559 | diagrams ==1.4.1, 560 | diagrams-cairo ==1.4.3, 561 | diagrams-canvas ==1.4.2, 562 | diagrams-contrib ==1.4.6, 563 | diagrams-core ==1.5.1.1, 564 | diagrams-lib ==1.4.7, 565 | diagrams-postscript ==1.5.2, 566 | diagrams-rasterific ==1.4.3, 567 | diagrams-solve ==0.1.3, 568 | diagrams-svg ==1.4.3.2, 569 | dice ==0.1.1, 570 | di-core ==1.0.4, 571 | dictionary-sharing ==0.1.0.0, 572 | di-df1 ==1.2.1, 573 | Diff ==1.0.2, 574 | diff-loc ==0.1.0.0, 575 | digest ==0.0.2.1, 576 | digits ==0.3.1, 577 | di-handle ==1.0.1, 578 | dimensional ==1.6.1, 579 | di-monad ==1.3.5, 580 | directory installed, 581 | directory-ospath-streaming ==0.2.1, 582 | directory-tree ==0.12.1, 583 | direct-sqlite ==2.3.29, 584 | dirichlet ==0.1.0.7, 585 | discount ==0.1.1, 586 | discover-instances ==0.1.0.0, 587 | disk-free-space ==0.1.0.1, 588 | distributed-closure ==0.5.0.0, 589 | distributed-process ==0.7.7, 590 | distributed-process-async ==0.2.10, 591 | distributed-process-client-server ==0.2.7.1, 592 | distributed-process-execution ==0.1.4.1, 593 | distributed-process-extras ==0.3.8, 594 | distributed-process-monad-control ==0.5.1.3, 595 | distributed-process-simplelocalnet ==0.3.2, 596 | distributed-process-supervisor ==0.2.3, 597 | distributed-process-systest ==0.4.1, 598 | distributed-process-tests ==0.5.1, 599 | distributed-static ==0.3.11, 600 | distribution-nixpkgs ==1.7.1.1, 601 | distribution-opensuse ==1.1.4, 602 | distributive ==0.6.2.1, 603 | djinn-lib ==0.0.1.4, 604 | djot ==0.1.2.2, 605 | dl-fedora ==1.2.1, 606 | dlist ==1.0, 607 | dlist-instances ==0.1.1.1, 608 | dns ==4.2.0, 609 | dockerfile ==0.2.0, 610 | doclayout ==0.5, 611 | docopt ==0.7.0.8, 612 | doctemplates ==0.11.0.1, 613 | doctest ==0.22.6, 614 | doctest-discover ==0.2.0.0, 615 | doctest-driver-gen ==0.3.0.8, 616 | doctest-exitcode-stdio ==0.0, 617 | doctest-extract ==0.1.2, 618 | doctest-lib ==0.1.1.1, 619 | doctest-parallel ==0.3.1.1, 620 | doldol ==0.4.1.2, 621 | do-list ==1.0.1, 622 | domain ==0.1.1.5, 623 | domain-aeson ==0.1.1.2, 624 | domain-cereal ==0.1.0.1, 625 | domain-core ==0.1.0.4, 626 | domain-optics ==0.1.0.4, 627 | do-notation ==0.1.0.2, 628 | dot ==0.3, 629 | dotgen ==0.4.3, 630 | dotnet-timespan ==0.0.1.0, 631 | dotparse ==0.1.2.0, 632 | double-conversion ==2.0.5.0, 633 | DPutils ==0.1.1.0, 634 | drifter ==0.3.0, 635 | drifter-postgresql ==0.2.1, 636 | drifter-sqlite ==0.1.0.0, 637 | dsp ==0.2.5.2, 638 | dual-tree ==0.2.3.1, 639 | dublincore-xml-conduit ==0.1.0.3, 640 | duration ==0.2.0.0, 641 | dynamic-state ==0.3.1, 642 | dyre ==0.9.2, 643 | eap ==0.9.0.2, 644 | Earley ==0.13.0.1, 645 | easy-file ==0.2.5, 646 | easy-logger ==0.1.0.7, 647 | Ebnf2ps ==1.0.15, 648 | echo ==0.1.4, 649 | ecstasy ==0.2.1.0, 650 | ed25519 ==0.0.5.0, 651 | ede ==0.3.4.0, 652 | edit-distance ==0.2.2.1, 653 | edit-distance-vector ==1.0.0.4, 654 | editor-open ==0.6.0.0, 655 | effectful ==2.5.1.0, 656 | effectful-core ==2.5.1.0, 657 | effectful-plugin ==1.1.0.4, 658 | effectful-th ==1.0.0.3, 659 | egison-pattern-src ==0.2.1.2, 660 | either ==5.0.2, 661 | either-unwrap ==1.1, 662 | ekg ==0.4.1.1, 663 | ekg-core ==0.1.1.8, 664 | ekg-json ==0.1.1.1, 665 | ekg-statsd ==0.2.6.1, 666 | elerea ==2.9.0, 667 | elf ==0.31, 668 | eliminators ==0.9.5, 669 | elm2nix ==0.4.0, 670 | elm-bridge ==0.8.4, 671 | elm-core-sources ==1.0.0, 672 | elm-export ==0.6.0.1, 673 | elm-syntax ==0.3.3.0, 674 | elynx ==0.8.0.0, 675 | elynx-markov ==0.8.0.0, 676 | elynx-nexus ==0.8.0.0, 677 | elynx-seq ==0.8.0.0, 678 | elynx-tools ==0.8.0.0, 679 | elynx-tree ==0.7.2.2, 680 | emacs-module ==0.2.1.1, 681 | email-validate ==2.3.2.21, 682 | emd ==0.2.0.0, 683 | emojis ==0.1.4.1, 684 | enclosed-exceptions ==1.0.3, 685 | encoding ==0.8.10, 686 | ENIG ==0.0.1.0, 687 | entropy ==0.4.1.10, 688 | enummapset ==0.7.3.0, 689 | enumset ==0.1, 690 | enum-subset-generate ==0.1.0.3, 691 | enum-text ==0.5.3.0, 692 | envelope ==0.2.2.0, 693 | envparse ==0.6.0, 694 | envy ==2.1.4.0, 695 | epub-metadata ==5.4, 696 | eq ==4.3, 697 | equal-files ==0.0.5.4, 698 | equivalence ==0.4.1, 699 | erf ==2.0.0.0, 700 | errata ==0.4.0.3, 701 | error ==1.0.0.0, 702 | errorcall-eq-instance ==0.3.0, 703 | error-or ==0.3.0, 704 | error-or-utils ==0.2.0, 705 | errors ==2.3.0, 706 | errors-ext ==0.4.2, 707 | ersatz ==0.5, 708 | esqueleto ==3.5.14.0, 709 | essence-of-live-coding ==0.2.8, 710 | essence-of-live-coding-gloss ==0.2.8, 711 | essence-of-live-coding-pulse ==0.2.8, 712 | essence-of-live-coding-quickcheck ==0.2.8, 713 | essence-of-live-coding-warp ==0.2.8, 714 | event-list ==0.1.3, 715 | every ==0.0.1, 716 | evm-opcodes ==0.2.0, 717 | exact-combinatorics ==0.2.0.11, 718 | exact-pi ==0.5.0.2, 719 | exception-hierarchy ==0.1.0.12, 720 | exception-mtl ==0.4.0.2, 721 | exceptions installed, 722 | exception-transformers ==0.4.0.12, 723 | executable-hash ==0.2.0.4, 724 | executable-path ==0.0.3.1, 725 | exinst ==0.9, 726 | exit-codes ==1.0.0, 727 | exomizer ==1.0.0, 728 | exon ==1.7.1.0, 729 | expiring-cache-map ==0.0.6.1, 730 | explicit-exception ==0.2, 731 | exp-pairs ==0.2.1.1, 732 | express ==1.0.16, 733 | extended-reals ==0.2.5.0, 734 | extensible-exceptions ==0.1.1.4, 735 | extra ==1.8, 736 | extractable-singleton ==0.0.1, 737 | extra-data-yj ==0.1.0.0, 738 | extrapolate ==0.4.6, 739 | fail ==4.9.0.0, 740 | FailT ==0.1.2.0, 741 | fakedata-parser ==0.1.0.0, 742 | fakefs ==0.3.0.2, 743 | fakepull ==0.3.0.2, 744 | faktory ==1.1.3.0, 745 | falsify ==0.2.0, 746 | fast-builder ==0.1.4.0, 747 | fast-digits ==0.3.2.0, 748 | fast-logger ==3.2.5, 749 | fast-math ==1.0.2, 750 | fast-myers-diff ==0.0.1, 751 | fbrnch ==1.6.1, 752 | fcf-family ==0.2.0.1, 753 | fdo-notify ==0.3.1, 754 | feature-flags ==0.1.0.1, 755 | fedora-releases ==0.2.0, 756 | fedora-repoquery ==0.7.1, 757 | FenwickTree ==0.1.2.1, 758 | fft ==0.1.8.7, 759 | fftw-ffi ==0.1, 760 | fgl ==5.8.3.0, 761 | fields-json ==0.4.0.0, 762 | filecache ==0.5.2, 763 | file-embed ==0.0.16.0, 764 | file-embed-lzma ==0.1, 765 | filelock ==0.1.1.7, 766 | filemanip ==0.3.6.3, 767 | file-modules ==0.1.2.4, 768 | filepath installed, 769 | file-path-th ==0.1.0.0, 770 | filepattern ==0.1.3, 771 | fileplow ==0.1.0.0, 772 | filter-logger ==0.6.0.0, 773 | fin ==0.3.2, 774 | FindBin ==0.0.5, 775 | fingertree ==0.1.5.0, 776 | finite-typelits ==0.2.1.0, 777 | first-class-families ==0.8.1.0, 778 | fits-parse ==0.4.2, 779 | fitspec ==0.4.10, 780 | fixed ==0.3, 781 | fixed-generic ==0.1.0.2, 782 | fixed-length ==0.2.3.1, 783 | fixed-vector ==1.2.3.0, 784 | fixed-vector-hetero ==0.6.2.0, 785 | fix-whitespace ==0.1, 786 | flac ==0.2.1, 787 | flac-picture ==0.1.3, 788 | flags-applicative ==0.1.0.3, 789 | flat ==0.6, 790 | flatparse ==0.5.2.1, 791 | flay ==0.5, 792 | flexible-defaults ==0.0.3, 793 | FloatingHex ==0.5, 794 | floatshow ==0.2.4, 795 | flow ==2.0.0.5, 796 | flush-queue ==1.0.0, 797 | fmlist ==0.9.4, 798 | fmt ==0.6.3.0, 799 | fn ==0.3.0.2, 800 | focus ==1.0.3.2, 801 | focuslist ==0.1.1.0, 802 | foldable1-classes-compat ==0.1.1, 803 | fold-debounce ==0.2.0.14, 804 | foldl ==1.4.18, 805 | folds ==0.7.8, 806 | FontyFruity ==0.5.3.5, 807 | force-layout ==0.4.1, 808 | foreign-store ==0.2.1, 809 | ForestStructures ==0.0.1.1, 810 | forkable-monad ==0.2.0.3, 811 | forma ==1.2.0, 812 | formatn ==0.3.1.0, 813 | format-numbers ==0.1.0.1, 814 | formatting ==7.2.0, 815 | foundation ==0.0.30, 816 | free ==5.2, 817 | free-alacarte ==1.0.0.9, 818 | free-categories ==0.2.0.2, 819 | free-foil ==0.2.0, 820 | freenect ==1.2.1, 821 | freer-par-monad ==0.1.0.0, 822 | freetype2 ==0.2.0, 823 | free-vl ==0.1.4, 824 | friendly-time ==0.4.1, 825 | frisby ==0.2.5, 826 | from-sum ==0.2.3.0, 827 | frontmatter ==0.1.0.2, 828 | fsnotify ==0.4.1.0, 829 | ftp-client ==0.5.1.6, 830 | funcmp ==1.9, 831 | function-builder ==0.3.0.1, 832 | functor-combinators ==0.4.1.3, 833 | functor-products ==0.1.2.2, 834 | fused-effects ==1.1.2.3, 835 | fusion-plugin ==0.2.7, 836 | fusion-plugin-types ==0.1.0, 837 | fuzzcheck ==0.1.1, 838 | fuzzy ==0.1.1.0, 839 | fuzzy-dates ==0.1.1.2, 840 | fuzzyset ==0.3.2, 841 | fuzzy-time ==0.3.0.0, 842 | gd ==3000.7.3, 843 | gdp ==0.0.3.0, 844 | gemini-exports ==0.1.0.2, 845 | general-games ==1.1.1, 846 | generically ==0.1.1, 847 | generic-arbitrary ==1.0.1, 848 | generic-constraints ==1.1.1.1, 849 | generic-data ==1.1.0.2, 850 | generic-data-functions ==0.6.0, 851 | generic-data-surgery ==0.3.0.0, 852 | generic-deriving ==1.14.6, 853 | generic-functor ==1.1.0.0, 854 | generic-lens ==2.2.2.0, 855 | generic-lens-core ==2.2.1.0, 856 | generic-monoid ==0.1.0.1, 857 | generic-optics ==2.2.1.0, 858 | GenericPretty ==1.2.2, 859 | generic-random ==1.5.0.1, 860 | generics-eot ==0.4.0.1, 861 | generics-sop ==0.5.1.4, 862 | generics-sop-lens ==0.2.1, 863 | generic-type-asserts ==0.3.0, 864 | genvalidity ==1.1.1.0, 865 | genvalidity-aeson ==1.0.0.1, 866 | genvalidity-appendful ==0.1.0.0, 867 | genvalidity-bytestring ==1.0.0.1, 868 | genvalidity-case-insensitive ==0.0.0.1, 869 | genvalidity-containers ==1.0.0.2, 870 | genvalidity-criterion ==1.1.0.0, 871 | genvalidity-hspec ==1.0.0.3, 872 | genvalidity-hspec-aeson ==1.0.0.0, 873 | genvalidity-hspec-binary ==1.0.0.0, 874 | genvalidity-hspec-cereal ==1.0.0.0, 875 | genvalidity-hspec-hashable ==1.0.0.1, 876 | genvalidity-hspec-optics ==1.0.0.0, 877 | genvalidity-hspec-persistent ==1.0.0.0, 878 | genvalidity-mergeful ==0.3.0.1, 879 | genvalidity-mergeless ==0.3.0.0, 880 | genvalidity-network-uri ==0.0.0.0, 881 | genvalidity-persistent ==1.0.0.2, 882 | genvalidity-property ==1.0.0.0, 883 | genvalidity-scientific ==1.0.0.0, 884 | genvalidity-text ==1.0.0.1, 885 | genvalidity-time ==1.0.0.1, 886 | genvalidity-typed-uuid ==0.1.0.1, 887 | genvalidity-unordered-containers ==1.0.0.1, 888 | genvalidity-uuid ==1.0.0.1, 889 | genvalidity-vector ==1.0.0.0, 890 | geodetics ==0.1.2, 891 | getopt-generics ==0.13.1.0, 892 | ghc installed, 893 | ghc-bignum installed, 894 | ghc-bignum-orphans ==0.1.1, 895 | ghc-boot installed, 896 | ghc-boot-th installed, 897 | ghc-byteorder ==4.11.0.0.10, 898 | ghc-check ==0.5.0.8, 899 | ghc-compact installed, 900 | ghc-core ==0.5.6, 901 | ghc-events ==0.20.0.0, 902 | ghc-experimental installed, 903 | ghc-heap installed, 904 | ghc-hs-meta ==0.1.5.0, 905 | ghcid ==0.8.9, 906 | ghci-hexcalc ==0.1.1.0, 907 | ghc-internal installed, 908 | ghcjs-codemirror ==0.0.0.2, 909 | ghcjs-dom ==0.9.9.2, 910 | ghcjs-dom-jsaddle ==0.9.9.0, 911 | ghcjs-perch ==0.3.3.3, 912 | ghc-lib ==9.10.1.20241103, 913 | ghc-lib-parser ==9.10.1.20241103, 914 | ghc-lib-parser-ex ==9.10.0.0, 915 | ghc-parser ==0.2.7.0, 916 | ghc-paths ==0.1.0.12, 917 | ghc-prim installed, 918 | ghc-source-gen ==0.4.6.0, 919 | ghc-syntax-highlighter ==0.0.12.0, 920 | ghc-tcplugins-extra ==0.4.6, 921 | ghc-trace-events ==0.1.2.9, 922 | ghc-typelits-extra ==0.4.7, 923 | ghc-typelits-knownnat ==0.7.12, 924 | ghc-typelits-natnormalise ==0.7.10, 925 | ghc-typelits-presburger ==0.7.4.0, 926 | ghost-buster ==0.1.1.0, 927 | ghostscript-parallel ==0.0.1, 928 | gi-atk ==2.0.28, 929 | gi-cairo ==1.0.30, 930 | gi-cairo-connector ==0.1.1, 931 | gi-cairo-render ==0.1.2, 932 | gi-dbusmenu ==0.4.14, 933 | gi-freetype2 ==2.0.5, 934 | gi-gdk ==4.0.9, 935 | gi-gdkpixbuf ==2.0.32, 936 | gi-gdkx11 ==4.0.8, 937 | gi-gio ==2.0.35, 938 | gi-glib ==2.0.30, 939 | gi-gmodule ==2.0.6, 940 | gi-gobject ==2.0.31, 941 | gi-graphene ==1.0.8, 942 | gi-gsk ==4.0.8, 943 | gi-gtk ==4.0.11, 944 | gi-harfbuzz ==0.0.10, 945 | ginger ==0.10.5.2, 946 | gio ==0.13.11.0, 947 | gi-pango ==1.0.30, 948 | githash ==0.1.7.0, 949 | github-release ==2.0.0.11, 950 | github-rest ==1.2.1, 951 | github-types ==0.2.1, 952 | github-webhooks ==0.17.0, 953 | gitlab-haskell ==1.0.2.2, 954 | gitlib ==3.1.3, 955 | gitlib-libgit2 ==3.1.2.1, 956 | gitlib-test ==3.1.2, 957 | git-mediate ==1.1.0, 958 | gitrev ==1.3.1, 959 | gi-xlib ==2.0.14, 960 | gl ==0.9, 961 | glabrous ==2.0.6.3, 962 | glasso ==0.1.0, 963 | GLFW-b ==3.3.9.1, 964 | glib ==0.13.11.0, 965 | glib-stopgap ==0.1.0.1, 966 | Glob ==0.10.2, 967 | glob-posix ==0.2.0.1, 968 | gloss ==1.13.2.2, 969 | gloss-algorithms ==1.13.0.3, 970 | gloss-rendering ==1.13.1.2, 971 | glpk-headers ==0.5.1, 972 | GLURaw ==2.0.0.5, 973 | GLUT ==2.7.0.16, 974 | gnuplot ==0.5.7, 975 | goldplate ==0.2.2.1, 976 | google-isbn ==1.0.3, 977 | google-oauth2-jwt ==0.3.3.1, 978 | gopher-proxy ==0.1.1.3, 979 | gpolyline ==0.1.0.1, 980 | graph-core ==0.3.0.0, 981 | graphite ==0.10.0.1, 982 | graphql ==1.5.0.0, 983 | graphql-spice ==1.0.6.0, 984 | graphs ==0.7.2, 985 | graphula ==2.1.0.0, 986 | graphviz ==2999.20.2.0, 987 | gravatar ==0.8.1, 988 | greskell ==2.0.3.2, 989 | greskell-core ==1.0.0.3, 990 | greskell-websocket ==1.0.0.3, 991 | gridtables ==0.1.0.0, 992 | grisette ==0.11.0.0, 993 | groom ==0.1.2.1, 994 | group-by-date ==0.1.0.5, 995 | groups ==0.5.3, 996 | gtk ==0.15.9, 997 | gtk2hs-buildtools ==0.13.11.0, 998 | gtk3 ==0.15.9, 999 | guarded-allocation ==0.0.1, 1000 | hackage-cli ==0.1.0.2, 1001 | hackage-db ==2.1.3, 1002 | hackage-security ==0.6.2.6, 1003 | hackage-security-HTTP ==0.1.1.2, 1004 | haddock-library ==1.11.0, 1005 | haha ==0.3.1.1, 1006 | hakyll ==4.16.4.0, 1007 | hal ==1.1, 1008 | half ==0.3.2, 1009 | hall-symbols ==0.1.0.6, 1010 | hamlet ==1.2.0, 1011 | hamtsolo ==1.0.4, 1012 | HandsomeSoup ==0.4.2, 1013 | handwriting ==0.1.0.3, 1014 | happstack-jmacro ==7.0.12.6, 1015 | happstack-server ==7.9.2.1, 1016 | happstack-server-tls ==7.2.1.6, 1017 | happy ==2.1.3, 1018 | happy-lib ==2.1.3, 1019 | happy-meta ==0.2.1.0, 1020 | harpie ==0.1.1.0, 1021 | harpie-numhask ==0.1.0.1, 1022 | HasBigDecimal ==0.2.0.0, 1023 | hashable ==1.5.0.0, 1024 | hashids ==1.1.1.0, 1025 | hashmap ==1.3.3, 1026 | hashtables ==1.4.1, 1027 | haskeline installed, 1028 | haskell-gi ==0.26.13, 1029 | haskell-gi-base ==0.26.8, 1030 | haskell-gi-overloading ==1.0, 1031 | haskell-lexer ==1.1.2, 1032 | haskell-src ==1.0.4.1, 1033 | haskell-src-exts ==1.23.1, 1034 | haskell-src-exts-simple ==1.23.1.0, 1035 | haskell-src-exts-util ==0.2.5, 1036 | haskell-src-meta ==0.8.14, 1037 | haskey-btree ==0.3.0.1, 1038 | haskoin-core ==1.1.0, 1039 | haskoin-store-data ==1.4.0, 1040 | hasktags ==0.73.0, 1041 | hasql ==1.8.1.4, 1042 | hasql-dynamic-statements ==0.3.1.7, 1043 | hasql-implicits ==0.2, 1044 | hasql-interpolate ==1.0.1.0, 1045 | hasql-listen-notify ==0.1.0.1, 1046 | hasql-migration ==0.3.1, 1047 | hasql-notifications ==0.2.3.1, 1048 | hasql-optparse-applicative ==0.8.0.1, 1049 | hasql-pool ==1.2.0.3, 1050 | hasql-th ==0.4.0.22, 1051 | hasql-transaction ==1.1.1.2, 1052 | has-transformers ==0.1.0.4, 1053 | hasty-hamiltonian ==1.3.4, 1054 | HaXml ==1.25.14, 1055 | haxr ==3000.11.5.1, 1056 | Hclip ==3.0.0.4, 1057 | HCodecs ==0.5.2, 1058 | hdaemonize ==0.5.7, 1059 | HDBC ==2.4.0.4, 1060 | HDBC-session ==0.1.2.1, 1061 | headed-megaparsec ==0.2.1.3, 1062 | heap ==1.0.4, 1063 | heaps ==0.4.1, 1064 | heatshrink ==0.1.0.0, 1065 | hebrew-time ==0.1.2, 1066 | hedgehog ==1.5, 1067 | hedgehog-classes ==0.2.5.4, 1068 | hedgehog-corpus ==0.2.0, 1069 | hedgehog-fn ==1.0, 1070 | hedgehog-quickcheck ==0.1.1, 1071 | hedis ==0.15.2, 1072 | hedn ==0.3.0.4, 1073 | heist ==1.1.1.2, 1074 | here ==1.2.14, 1075 | heredoc ==0.2.0.0, 1076 | heterocephalus ==1.0.5.7, 1077 | hetero-parameter-list ==0.1.0.19, 1078 | hetero-parameter-list-with-typelevel-tools ==0.1.0.1, 1079 | hex ==0.2.0, 1080 | hexml ==0.3.5, 1081 | hexml-lens ==0.2.2, 1082 | hexpat ==0.20.13, 1083 | hex-text ==0.1.0.9, 1084 | hformat ==0.3.3.1, 1085 | hfsevents ==0.1.7, 1086 | hgal ==2.0.0.3, 1087 | hidapi ==0.1.8, 1088 | hie-bios ==0.14.0, 1089 | hi-file-parser ==0.1.7.0, 1090 | hinfo ==0.0.3.0, 1091 | hinotify ==0.4.1, 1092 | hint ==0.9.0.8, 1093 | histogram-fill ==0.9.1.0, 1094 | hjsmin ==0.2.1, 1095 | hkd-default ==1.1.0.0, 1096 | hkgr ==0.4.6, 1097 | hledger ==1.41, 1098 | hledger-iadd ==1.3.21, 1099 | hledger-interest ==1.6.7, 1100 | hledger-lib ==1.41, 1101 | hledger-stockquotes ==0.1.3.2, 1102 | hledger-ui ==1.41, 1103 | hledger-web ==1.41, 1104 | hlibcpuid ==0.2.0, 1105 | hlibgit2 ==0.18.0.16, 1106 | hlibsass ==0.1.10.1, 1107 | hmatrix ==0.20.2, 1108 | hmatrix-backprop ==0.1.3.0, 1109 | hmatrix-gsl ==0.19.0.1, 1110 | hmatrix-gsl-stats ==0.4.1.8, 1111 | hmatrix-morpheus ==0.1.1.2, 1112 | hmatrix-repa ==0.1.2.2, 1113 | hmatrix-special ==0.19.0.0, 1114 | hmatrix-vector-sized ==0.1.3.0, 1115 | hmpfr ==0.4.5, 1116 | hoauth2 ==2.14.1, 1117 | hoogle ==5.0.18.4, 1118 | hopenssl ==2.2.5, 1119 | horizontal-rule ==0.7.0.0, 1120 | hosc ==0.20, 1121 | hostname ==1.0, 1122 | hostname-validate ==1.0.0, 1123 | hourglass ==0.2.12, 1124 | hourglass-orphans ==0.1.0.0, 1125 | hp2pretty ==0.10.1, 1126 | hpack ==0.37.0, 1127 | hpc installed, 1128 | hpc-codecov ==0.6.2.0, 1129 | HPDF ==1.7, 1130 | hpp ==0.6.5, 1131 | hpqtypes ==1.12.0.0, 1132 | hpqtypes-extras ==1.16.4.4, 1133 | hquantlib-time ==0.1.1, 1134 | hreader ==1.1.1, 1135 | hreader-lens ==0.1.3.0, 1136 | hruby ==0.5.1.0, 1137 | hsass ==0.8.0, 1138 | hs-bibutils ==6.10.0.0, 1139 | hsc2hs ==0.68.10, 1140 | hs-captcha ==1.0, 1141 | hscolour ==1.25, 1142 | hsdns ==1.8, 1143 | hse-cpp ==0.2, 1144 | hsemail ==2.2.2, 1145 | hset ==2.2.0, 1146 | HSet ==0.0.2, 1147 | hs-GeoIP ==0.3, 1148 | hsignal ==0.2.7.5, 1149 | hsini ==0.5.2.2, 1150 | hsinstall ==2.8, 1151 | HSlippyMap ==3.0.1, 1152 | hslogger ==1.3.1.1, 1153 | hslua ==2.3.1, 1154 | hslua-aeson ==2.3.1.1, 1155 | hslua-classes ==2.3.1, 1156 | hslua-cli ==1.4.3, 1157 | hslua-core ==2.3.2, 1158 | hslua-list ==1.1.4, 1159 | hslua-marshalling ==2.3.1, 1160 | hslua-module-doclayout ==1.2.0, 1161 | hslua-module-path ==1.1.1, 1162 | hslua-module-system ==1.1.2, 1163 | hslua-module-text ==1.1.1, 1164 | hslua-module-version ==1.1.1, 1165 | hslua-module-zip ==1.1.3, 1166 | hslua-objectorientation ==2.3.1, 1167 | hslua-packaging ==2.3.1, 1168 | hslua-repl ==0.1.2, 1169 | hslua-typing ==0.1.1, 1170 | hsndfile ==0.8.0, 1171 | hsndfile-vector ==0.5.2, 1172 | HsOpenSSL ==0.11.7.8, 1173 | HsOpenSSL-x509-system ==0.1.0.4, 1174 | hspec ==2.11.10, 1175 | hspec-api ==2.11.10, 1176 | hspec-attoparsec ==0.1.0.2, 1177 | hspec-checkers ==0.1.0.2, 1178 | hspec-contrib ==0.5.2, 1179 | hspec-core ==2.11.10, 1180 | hspec-discover ==2.11.10, 1181 | hspec-expectations ==0.8.4, 1182 | hspec-expectations-json ==1.0.2.1, 1183 | hspec-expectations-lifted ==0.10.0, 1184 | hspec-expectations-pretty-diff ==0.7.2.6, 1185 | hspec-golden ==0.2.2.0, 1186 | hspec-golden-aeson ==0.9.0.0, 1187 | hspec-hedgehog ==0.3.0.0, 1188 | hspec-junit-formatter ==1.1.2.1, 1189 | hspec-leancheck ==0.0.6, 1190 | hspec-megaparsec ==2.2.1, 1191 | hspec-meta ==2.11.10, 1192 | hspec-need-env ==0.1.0.11, 1193 | hspec-parsec ==0, 1194 | hspec-smallcheck ==0.5.3, 1195 | hspec-tmp-proc ==0.7.0.0, 1196 | hspec-wai ==0.11.1, 1197 | hspec-wai-json ==0.11.0, 1198 | hspec-webdriver ==1.2.2, 1199 | hs-php-session ==0.0.9.3, 1200 | hstatistics ==0.3.1, 1201 | HStringTemplate ==0.8.8, 1202 | HSvm ==1.0.3.35, 1203 | HsYAML ==0.2.1.4, 1204 | HsYAML-aeson ==0.2.0.1, 1205 | hsyslog ==5.0.2, 1206 | htaglib ==1.2.1, 1207 | HTF ==0.15.0.2, 1208 | html ==1.0.1.2, 1209 | html-conduit ==1.3.2.2, 1210 | html-email-validate ==0.2.0.0, 1211 | html-entities ==1.1.4.7, 1212 | html-entity-map ==0.1.0.0, 1213 | HTTP ==4000.4.1, 1214 | http2 ==5.3.9, 1215 | http-api-data ==0.6.1, 1216 | http-client ==0.7.18, 1217 | http-client-openssl ==0.3.3, 1218 | http-client-overrides ==0.1.1.0, 1219 | http-client-restricted ==0.1.0, 1220 | http-client-tls ==0.3.6.4, 1221 | http-common ==0.8.3.4, 1222 | http-conduit ==2.3.9.1, 1223 | http-date ==0.0.11, 1224 | http-directory ==0.1.10, 1225 | httpd-shed ==0.4.1.2, 1226 | http-io-streams ==0.1.7.0, 1227 | http-link-header ==1.2.1, 1228 | http-media ==0.8.1.1, 1229 | http-query ==0.1.3, 1230 | http-reverse-proxy ==0.6.1.0, 1231 | http-semantics ==0.3.0, 1232 | http-streams ==0.8.9.9, 1233 | http-types ==0.12.4, 1234 | human-readable-duration ==0.2.1.4, 1235 | HUnit ==1.6.2.0, 1236 | HUnit-approx ==1.1.1.1, 1237 | hunit-dejafu ==2.0.0.6, 1238 | hvect ==0.4.0.1, 1239 | hvega ==0.12.0.7, 1240 | hw-bits ==0.7.2.2, 1241 | hw-conduit-merges ==0.2.1.0, 1242 | hw-diagnostics ==0.0.1.0, 1243 | hweblib ==0.6.3, 1244 | hw-excess ==0.2.3.0, 1245 | hw-hedgehog ==0.1.1.1, 1246 | hw-int ==0.0.2.0, 1247 | hw-json-simd ==0.1.1.2, 1248 | hwk ==0.6, 1249 | hw-kafka-client ==5.3.0, 1250 | hw-mquery ==0.2.1.2, 1251 | hw-parser ==0.1.1.0, 1252 | hw-prim ==0.6.3.2, 1253 | hw-rankselect-base ==0.3.4.1, 1254 | hw-streams ==0.0.1.1, 1255 | hw-string-parse ==0.0.0.5, 1256 | hxt ==9.3.1.22, 1257 | hxt-charproperties ==9.5.0.0, 1258 | hxt-css ==0.1.0.3, 1259 | hxt-curl ==9.1.1.1, 1260 | hxt-expat ==9.1.1, 1261 | hxt-http ==9.1.5.2, 1262 | hxt-regex-xmlschema ==9.2.0.7, 1263 | hxt-tagsoup ==9.1.4, 1264 | hxt-unicode ==9.0.2.4, 1265 | hybrid-vectors ==0.2.5, 1266 | hyperloglog ==0.4.6, 1267 | hyphenation ==0.8.2, 1268 | iconv ==0.4.1.3, 1269 | identicon ==0.2.3, 1270 | ieee754 ==0.8.0, 1271 | if ==0.1.0.0, 1272 | IfElse ==0.85, 1273 | iff ==0.0.6.1, 1274 | ihs ==0.1.0.3, 1275 | imagesize-conduit ==1.1, 1276 | immortal ==0.3, 1277 | immortal-queue ==0.1.0.1, 1278 | imp ==1.0.3.0, 1279 | inbox ==0.2.0, 1280 | incipit-base ==0.6.1.0, 1281 | incipit-core ==0.6.1.0, 1282 | include-file ==0.1.0.4, 1283 | incremental ==0.3.1, 1284 | indents ==0.5.0.1, 1285 | indexed ==0.1.3, 1286 | indexed-containers ==0.1.0.2, 1287 | indexed-list-literals ==0.2.1.3, 1288 | indexed-profunctors ==0.1.1.1, 1289 | indexed-transformers ==0.1.0.4, 1290 | indexed-traversable ==0.1.4, 1291 | indexed-traversable-instances ==0.1.2, 1292 | infer-license ==0.2.0, 1293 | infinite-list ==0.1.2, 1294 | influxdb ==1.9.3.2, 1295 | ini ==0.4.2, 1296 | inj ==1.0, 1297 | inline-c ==0.9.1.10, 1298 | inline-c-cpp ==0.5.0.2, 1299 | input-parsers ==0.3.0.2, 1300 | inspection-testing ==0.5.0.3, 1301 | int-cast ==0.2.0.0, 1302 | integer-conversion ==0.1.1, 1303 | integer-gmp installed, 1304 | integer-logarithms ==1.0.4, 1305 | integer-roots ==1.0.2.0, 1306 | integration ==0.2.1, 1307 | intern ==0.9.6, 1308 | interpolate ==0.2.1, 1309 | interpolatedstring-perl6 ==1.0.2, 1310 | interpolation ==0.1.1.2, 1311 | Interpolation ==0.3.0, 1312 | IntervalMap ==0.6.2.1, 1313 | intervals ==0.9.3, 1314 | intset-imperative ==0.1.0.0, 1315 | int-supply ==1.0.0, 1316 | invariant ==0.6.4, 1317 | invertible ==0.2.0.8, 1318 | invertible-grammar ==0.1.3.5, 1319 | io-embed ==0.1.0.1, 1320 | io-machine ==0.2.0.0, 1321 | io-manager ==0.1.0.4, 1322 | io-memoize ==1.1.1.0, 1323 | io-region ==0.1.1, 1324 | io-storage ==0.3, 1325 | io-streams ==1.5.2.2, 1326 | io-streams-haproxy ==1.0.1.0, 1327 | ip ==1.7.8, 1328 | ip6addr ==2.0.0, 1329 | iproute ==1.7.15, 1330 | IPv6Addr ==2.0.6, 1331 | IPv6DB ==0.3.3.4, 1332 | ipynb ==0.2, 1333 | ipython-kernel ==0.11.0.0, 1334 | irc ==0.6.1.1, 1335 | irc-ctcp ==0.1.3.1, 1336 | isbn ==1.1.0.5, 1337 | islink ==0.1.0.0, 1338 | iso3166-country-codes ==0.20140203.8, 1339 | iso639 ==0.1.0.3, 1340 | iso8601-time ==0.1.5, 1341 | isocline ==1.0.9, 1342 | isomorphism-class ==0.3, 1343 | ix-shapable ==0.1.0, 1344 | jack ==0.7.2.2, 1345 | jailbreak-cabal ==1.4, 1346 | jalaali ==1.0.0.0, 1347 | java-adt ==1.0.20231204, 1348 | jira-wiki-markup ==1.5.1, 1349 | jmacro ==0.6.18, 1350 | jose ==0.11, 1351 | jose-jwt ==0.10.0, 1352 | jsaddle ==0.9.9.2, 1353 | jsaddle-dom ==0.9.9.2, 1354 | js-chart ==2.9.4.1, 1355 | js-dgtable ==0.5.2, 1356 | js-flot ==0.8.3, 1357 | js-jquery ==3.3.1, 1358 | json ==0.11, 1359 | json-feed ==2.0.0.12, 1360 | jsonifier ==0.2.1.3, 1361 | jsonpath ==0.3.0.0, 1362 | json-rpc ==1.1.1, 1363 | json-spec ==1.1.0.0, 1364 | json-spec-elm ==0.4.0.5, 1365 | json-spec-elm-servant ==0.4.2.2, 1366 | json-stream ==0.4.6.0, 1367 | JuicyCairo ==0.1.0.0, 1368 | JuicyPixels ==3.3.9, 1369 | JuicyPixels-extra ==0.6.0, 1370 | junit-xml ==0.1.0.3, 1371 | justified-containers ==0.3.0.0, 1372 | kan-extensions ==5.2.6, 1373 | kansas-comet ==0.4.3, 1374 | katip ==0.8.8.2, 1375 | katip-logstash ==0.1.0.2, 1376 | katip-wai ==0.2.0.0, 1377 | kazura-queue ==0.1.0.4, 1378 | kdt ==0.2.6, 1379 | keep-alive ==0.2.1.0, 1380 | keter ==2.1.8, 1381 | keuringsdienst ==1.0.2.2, 1382 | keycode ==0.2.3, 1383 | keys ==3.12.4, 1384 | ki ==1.0.1.2, 1385 | kind-apply ==0.4.0.0, 1386 | kind-generics ==0.5.0.0, 1387 | ki-unlifted ==1.0.0.2, 1388 | kmeans ==0.1.3, 1389 | knob ==0.2.2, 1390 | koji ==0.0.2, 1391 | koji-tool ==1.2, 1392 | kvitable ==1.1.0.1, 1393 | labels ==0.3.3, 1394 | lackey ==2.0.0.8, 1395 | lame ==0.2.2, 1396 | language-avro ==0.1.4.0, 1397 | language-c ==0.10.0, 1398 | language-c99 ==0.2.0, 1399 | language-c99-simple ==0.3.0, 1400 | language-c99-util ==0.2.0, 1401 | language-c-quote ==0.13.0.2, 1402 | language-docker ==13.0.0, 1403 | language-dot ==0.1.2, 1404 | language-glsl ==0.3.0, 1405 | language-java ==0.2.9, 1406 | language-javascript ==0.7.1.0, 1407 | language-lua ==0.11.0.2, 1408 | language-nix ==2.2.0, 1409 | language-protobuf ==1.0.1, 1410 | lapack-carray ==0.0.3, 1411 | lapack-comfort-array ==0.0.1, 1412 | lapack-ffi ==0.0.3, 1413 | lapack-ffi-tools ==0.1.3.1, 1414 | large-hashable ==0.1.1.0, 1415 | largeword ==1.2.5, 1416 | latex ==0.1.0.4, 1417 | lattices ==2.2.1, 1418 | lawful ==0.1.0.0, 1419 | lawful-conversions ==0.1.6, 1420 | lazy-csv ==0.5.1, 1421 | lazyio ==0.1.0.4, 1422 | lazysmallcheck ==0.6, 1423 | lca ==0.4, 1424 | leancheck ==1.0.2, 1425 | leancheck-instances ==0.0.5, 1426 | leapseconds-announced ==2017.1.0.1, 1427 | learn-physics ==0.6.7, 1428 | leb128-cereal ==1.2, 1429 | lens ==5.3.3, 1430 | lens-action ==0.2.6, 1431 | lens-aeson ==1.2.3, 1432 | lens-csv ==0.1.1.0, 1433 | lens-family ==2.1.3, 1434 | lens-family-core ==2.1.3, 1435 | lens-misc ==0.0.2.0, 1436 | lens-properties ==4.11.1, 1437 | lens-regex ==0.1.3, 1438 | lens-regex-pcre ==1.1.2.0, 1439 | lentil ==1.5.8.0, 1440 | LetsBeRational ==1.0.0.0, 1441 | leveldb-haskell ==0.6.5, 1442 | libBF ==0.6.8, 1443 | libffi ==0.2.1, 1444 | libmpd ==0.10.0.1, 1445 | liboath-hs ==0.0.1.2, 1446 | libyaml ==0.1.4, 1447 | libyaml-clib ==0.2.5, 1448 | lifted-async ==0.10.2.7, 1449 | lifted-base ==0.2.3.12, 1450 | lift-generics ==0.3, 1451 | lift-type ==0.1.2.0, 1452 | linear ==1.23, 1453 | linear-base ==0.4.0, 1454 | linear-generics ==0.2.3, 1455 | linear-programming ==0.0.1, 1456 | linebreak ==1.1.0.4, 1457 | linux-capabilities ==0.1.1.0, 1458 | linux-file-extents ==0.2.0.1, 1459 | linux-namespaces ==0.2.0.1, 1460 | List ==0.6.2, 1461 | ListLike ==4.7.8.2, 1462 | list-predicate ==0.1.0.1, 1463 | listsafe ==0.1.0.1, 1464 | list-shuffle ==1.0.0.1, 1465 | list-t ==1.0.5.7, 1466 | list-transformer ==1.1.1, 1467 | ListTree ==0.2.3, 1468 | list-witnesses ==0.1.4.1, 1469 | ListZipper ==1.2.0.2, 1470 | literatex ==0.3.0.0, 1471 | lmdb ==0.2.5, 1472 | load-env ==0.2.1.0, 1473 | locators ==0.3.0.5, 1474 | loch-th ==0.2.2, 1475 | lockfree-queue ==0.2.4, 1476 | log-base ==0.12.0.1, 1477 | log-domain ==0.13.2, 1478 | logfloat ==0.14.0, 1479 | logging ==3.0.5, 1480 | logging-effect ==1.4.0, 1481 | logging-facade ==0.3.1, 1482 | logging-facade-syslog ==1, 1483 | logict ==0.8.2.0, 1484 | logstash ==0.1.0.4, 1485 | loop ==0.3.0, 1486 | lpeg ==1.1.0, 1487 | LPFP ==1.1.4, 1488 | LPFP-core ==1.1.1, 1489 | lrucache ==1.2.0.1, 1490 | lua ==2.3.3, 1491 | lua-arbitrary ==1.0.1.1, 1492 | lucid ==2.11.20230408, 1493 | lucid2 ==0.0.20240424, 1494 | lucid-cdn ==0.2.2.0, 1495 | lucid-extras ==0.2.2, 1496 | lukko ==0.1.2, 1497 | lumberjack ==1.0.3.0, 1498 | lz4 ==0.2.3.1, 1499 | lz4-frame-conduit ==0.1.0.2, 1500 | lzma ==0.0.1.1, 1501 | lzma-clib ==5.2.2, 1502 | machines ==0.7.3, 1503 | magic ==1.1, 1504 | mailtrap ==0.1.2.1, 1505 | mainland-pretty ==0.7.1.1, 1506 | main-tester ==0.2.0.1, 1507 | managed ==1.0.10, 1508 | Mantissa ==0.1.0.0, 1509 | mappings ==0.3.1.0, 1510 | map-syntax ==0.3, 1511 | markdown ==0.1.17.5, 1512 | markdown-unlit ==0.6.0, 1513 | markov-chain ==0.0.3.4, 1514 | markov-chain-usage-model ==0.0.0, 1515 | markup-parse ==0.1.1.1, 1516 | massiv ==1.0.4.0, 1517 | massiv-io ==1.0.0.1, 1518 | massiv-serialise ==1.0.0.2, 1519 | massiv-test ==1.1.0.0, 1520 | matchable ==0.1.2.1, 1521 | mathexpr ==0.3.1.0, 1522 | math-extras ==0.1.1.0, 1523 | math-functions ==0.3.4.4, 1524 | mathlist ==0.2.0.0, 1525 | matplotlib ==0.7.7, 1526 | matrices ==0.5.0, 1527 | matrix ==0.3.6.3, 1528 | matrix-as-xyz ==0.1.2.2, 1529 | matrix-market-attoparsec ==0.1.1.3, 1530 | matrix-static ==0.3, 1531 | maximal-cliques ==0.1.1, 1532 | mbox-utility ==0.0.3.1, 1533 | mcmc ==0.8.3.1, 1534 | mcmc-types ==1.0.3, 1535 | mealy ==0.5.0.0, 1536 | median-stream ==0.7.0.0, 1537 | med-module ==0.1.3, 1538 | megaparsec ==9.7.0, 1539 | megaparsec-tests ==9.7.0, 1540 | melf ==1.3.1, 1541 | membership ==0.0.1, 1542 | memcache ==0.3.0.2, 1543 | mem-info ==0.3.0.0, 1544 | memory ==0.18.0, 1545 | MemoTrie ==0.6.11, 1546 | mergeful ==0.3.0.0, 1547 | mergeful-persistent ==0.3.0.1, 1548 | mergeless ==0.4.0.0, 1549 | mergeless-persistent ==0.1.0.1, 1550 | mersenne-random ==1.0.0.1, 1551 | mersenne-random-pure64 ==0.2.2.0, 1552 | messagepack ==0.5.5, 1553 | metrics ==0.4.1.1, 1554 | mfsolve ==0.3.2.2, 1555 | microaeson ==0.1.0.2, 1556 | microlens ==0.4.13.1, 1557 | microlens-aeson ==2.5.2, 1558 | microlens-contra ==0.1.0.3, 1559 | microlens-ghc ==0.4.14.3, 1560 | microlens-mtl ==0.2.0.3, 1561 | microlens-platform ==0.4.3.6, 1562 | microlens-th ==0.4.3.16, 1563 | microspec ==0.2.1.3, 1564 | microstache ==1.0.3, 1565 | midair ==0.2.0.1, 1566 | midi ==0.2.2.4, 1567 | midi-alsa ==0.2.1, 1568 | midi-music-box ==0.0.1.2, 1569 | mighty-metropolis ==2.0.0, 1570 | mime-mail ==0.5.1, 1571 | mime-mail-ses ==0.4.3, 1572 | mime-types ==0.1.2.0, 1573 | minimal-configuration ==0.1.4, 1574 | minimorph ==0.3.0.1, 1575 | minisat-solver ==0.1, 1576 | miniterion ==0.1.1.1, 1577 | miniutter ==0.5.1.2, 1578 | mintty ==0.1.4, 1579 | misfortune ==0.1.2.1, 1580 | miso ==1.8.5.0, 1581 | missing-foreign ==0.1.1, 1582 | MissingH ==1.6.0.1, 1583 | mixed-types-num ==0.6.2, 1584 | mmap ==0.5.9, 1585 | mmark ==0.0.8.0, 1586 | mmark-cli ==0.0.5.2, 1587 | mmark-ext ==0.2.1.5, 1588 | mmorph ==1.2.0, 1589 | mnist-idx ==0.1.3.2, 1590 | mnist-idx-conduit ==0.4.0.0, 1591 | mockcat ==0.5.2.0, 1592 | mockery ==0.3.5, 1593 | mod ==0.2.0.1, 1594 | modern-uri ==0.3.6.1, 1595 | modular ==0.1.0.8, 1596 | moffy ==0.1.1.0, 1597 | moffy-samples ==0.1.0.3, 1598 | moffy-samples-events ==0.2.2.5, 1599 | moffy-samples-gtk3 ==0.1.0.0, 1600 | moffy-samples-gtk3-run ==0.1.0.7, 1601 | monad-control ==1.0.3.1, 1602 | monad-control-aligned ==0.0.2.1, 1603 | monad-control-identity ==0.2.0.0, 1604 | monad-coroutine ==0.9.2, 1605 | monad-extras ==0.6.0, 1606 | monad-interleave ==0.2.0.1, 1607 | monadlist ==0.0.2, 1608 | monad-logger ==0.3.41, 1609 | monad-logger-aeson ==0.4.1.3, 1610 | monad-logger-json ==0.1.0.0, 1611 | monad-logger-logstash ==0.2.0.2, 1612 | monad-loops ==0.4.3, 1613 | monad-memo ==0.5.4, 1614 | monad-metrics ==0.2.2.2, 1615 | monadoid ==0.0.3, 1616 | monadology ==0.4, 1617 | monad-par ==0.3.6, 1618 | monad-parallel ==0.8, 1619 | monad-par-extras ==0.3.3, 1620 | monad-peel ==0.3, 1621 | MonadPrompt ==1.0.0.5, 1622 | MonadRandom ==0.6.1, 1623 | monad-resumption ==0.1.4.0, 1624 | monad-st ==0.2.4.1, 1625 | monads-tf ==0.3.0.1, 1626 | monad-time ==0.4.0.0, 1627 | mongoDB ==2.7.1.4, 1628 | monoidal-functors ==0.2.3.0, 1629 | monoid-extras ==0.6.3, 1630 | monoidmap ==0.0.1.7, 1631 | monoid-subclasses ==1.2.5.1, 1632 | monoid-transformer ==0.0.4, 1633 | mono-traversable ==1.0.21.0, 1634 | mono-traversable-instances ==0.1.1.0, 1635 | more-containers ==0.2.2.2, 1636 | morpheus-graphql ==0.28.1, 1637 | morpheus-graphql-app ==0.28.1, 1638 | morpheus-graphql-client ==0.28.1, 1639 | morpheus-graphql-code-gen ==0.28.1, 1640 | morpheus-graphql-code-gen-utils ==0.28.1, 1641 | morpheus-graphql-core ==0.28.1, 1642 | morpheus-graphql-server ==0.28.1, 1643 | morpheus-graphql-subscriptions ==0.28.1, 1644 | moss ==0.2.0.1, 1645 | mountpoints ==1.0.2, 1646 | mpi-hs ==0.7.3.1, 1647 | mpi-hs-binary ==0.1.1.0, 1648 | mpi-hs-cereal ==0.1.0.0, 1649 | mt19937 ==0.1.1, 1650 | mtl installed, 1651 | mtl-compat ==0.2.2, 1652 | mtl-misc-yj ==0.1.0.4, 1653 | mtl-prelude ==2.0.3.2, 1654 | multiarg ==0.30.0.10, 1655 | multimap ==1.2.1, 1656 | multipart ==0.2.1, 1657 | MultipletCombiner ==0.0.7, 1658 | multiset ==0.3.4.3, 1659 | murmur3 ==1.0.5, 1660 | murmur-hash ==0.1.0.11, 1661 | MusicBrainz ==0.4.1, 1662 | mustache ==2.4.2, 1663 | mutable-containers ==0.3.4.1, 1664 | mwc-probability ==2.3.1, 1665 | mwc-random ==0.15.1.0, 1666 | mx-state-codes ==1.0.0.0, 1667 | myers-diff ==0.3.0.0, 1668 | mysql ==0.2.1, 1669 | mysql-json-table ==0.1.4.0, 1670 | mysql-simple ==0.4.9, 1671 | n2o ==0.11.1, 1672 | n2o-nitro ==0.11.2, 1673 | nagios-check ==0.3.2, 1674 | named ==0.3.0.2, 1675 | named-text ==1.2.1.0, 1676 | names-th ==0.3.0.1, 1677 | nano-erl ==0.1.0.1, 1678 | NanoID ==3.4.0.2, 1679 | nanospec ==0.2.2, 1680 | nats ==1.1.2, 1681 | natural-arithmetic ==0.2.1.0, 1682 | natural-induction ==0.2.0.0, 1683 | natural-sort ==0.1.2, 1684 | natural-transformation ==0.4.1, 1685 | neat-interpolation ==0.5.1.4, 1686 | netcode-io ==0.0.3, 1687 | netlib-carray ==0.1, 1688 | netlib-comfort-array ==0.0.0.2, 1689 | netlib-ffi ==0.1.2, 1690 | netpbm ==1.0.4, 1691 | netrc ==0.2.0.1, 1692 | nettle ==0.3.1.1, 1693 | netwire ==5.0.3, 1694 | netwire-input ==0.0.7, 1695 | netwire-input-glfw ==0.0.12, 1696 | network ==3.2.7.0, 1697 | network-bsd ==2.8.1.0, 1698 | network-byte-order ==0.1.7, 1699 | network-conduit-tls ==1.4.0.1, 1700 | network-control ==0.1.3, 1701 | network-house ==0.1.0.3, 1702 | network-info ==0.2.1, 1703 | network-ip ==0.3.0.3, 1704 | network-messagepack-rpc ==0.1.2.0, 1705 | network-multicast ==0.3.2, 1706 | network-run ==0.4.3, 1707 | network-simple ==0.4.5, 1708 | network-simple-tls ==0.4.2, 1709 | network-transport ==0.5.8, 1710 | network-transport-inmemory ==0.5.41, 1711 | network-transport-tcp ==0.8.5, 1712 | network-transport-tests ==0.3.3, 1713 | network-uri ==2.6.4.2, 1714 | network-wait ==0.2.0.0, 1715 | newtype ==0.2.2.0, 1716 | newtype-generics ==0.6.2, 1717 | nfc ==0.1.1, 1718 | nicify-lib ==1.0.1, 1719 | NineP ==0.0.2.1, 1720 | nix-paths ==1.0.1, 1721 | NoHoed ==0.1.1, 1722 | nonce ==1.0.7, 1723 | nondeterminism ==1.5, 1724 | non-empty ==0.3.5, 1725 | nonempty-containers ==0.3.4.5, 1726 | non-empty-sequence ==0.2.0.4, 1727 | non-empty-text ==0.2.1, 1728 | nonempty-vector ==0.2.4, 1729 | nonempty-zipper ==1.0.0.4, 1730 | non-negative ==0.1.2, 1731 | normaldistribution ==1.1.0.3, 1732 | nothunks ==0.3.0.0, 1733 | no-value ==1.0.0.0, 1734 | nowdoc ==0.1.1.0, 1735 | nsis ==0.3.3, 1736 | n-tuple ==0.0.3, 1737 | numbers ==3000.2.0.2, 1738 | numeric-extras ==0.1, 1739 | numeric-limits ==0.1.0.0, 1740 | numeric-prelude ==0.4.4, 1741 | numeric-quest ==0.2.0.2, 1742 | numhask ==0.12.1.0, 1743 | numhask-array ==0.11.1.0, 1744 | numhask-space ==0.12.0.0, 1745 | NumInstances ==1.4, 1746 | numtype-dk ==0.5.0.3, 1747 | nuxeo ==0.3.2, 1748 | nvim-hs ==2.3.2.3, 1749 | nvim-hs-contrib ==2.0.0.2, 1750 | nvim-hs-ghcid ==2.0.1.0, 1751 | ObjectName ==1.1.0.2, 1752 | o-clock ==1.4.0, 1753 | odbc ==0.3.0, 1754 | ods2csv ==0.1, 1755 | oeis2 ==1.0.9, 1756 | ofx ==0.4.4.0, 1757 | old-locale ==1.0.0.7, 1758 | old-time ==1.1.0.4, 1759 | ollama-haskell ==0.1.2.0, 1760 | om-elm ==2.0.0.7, 1761 | om-show ==0.1.2.10, 1762 | once ==0.4, 1763 | one-liner ==2.1, 1764 | one-liner-instances ==0.1.3.0, 1765 | OneTuple ==0.4.2, 1766 | Only ==0.1, 1767 | oo-prototypes ==0.1.0.0, 1768 | oops ==0.2.0.1, 1769 | opaleye ==0.10.4.0, 1770 | OpenAL ==1.7.0.5, 1771 | open-browser ==0.2.1.0, 1772 | openexr-write ==0.1.0.2, 1773 | OpenGL ==3.0.3.0, 1774 | OpenGLRaw ==3.3.4.1, 1775 | openpgp-asciiarmor ==0.1.2, 1776 | opensource ==0.1.1.0, 1777 | openssl-streams ==1.2.3.0, 1778 | opentelemetry ==0.8.0, 1779 | opentelemetry-extra ==0.8.0, 1780 | opentelemetry-lightstep ==0.8.0, 1781 | opentelemetry-wai ==0.8.0, 1782 | open-witness ==0.7, 1783 | operational ==0.2.4.2, 1784 | opml-conduit ==0.9.0.0, 1785 | optics ==0.4.2.1, 1786 | optics-core ==0.4.1.1, 1787 | optics-extra ==0.4.2.1, 1788 | optics-operators ==0.1.0.1, 1789 | optics-th ==0.4.1, 1790 | optics-vl ==0.2.1, 1791 | optima ==0.4.0.5, 1792 | optional-args ==1.0.2, 1793 | options ==1.2.1.2, 1794 | optparse-applicative ==0.18.1.0, 1795 | optparse-enum ==1.0.0.0, 1796 | optparse-generic ==1.5.2, 1797 | optparse-simple ==0.1.1.4, 1798 | optparse-text ==0.1.1.0, 1799 | OrderedBits ==0.0.2.0, 1800 | ordered-containers ==0.2.4, 1801 | ormolu ==0.7.7.0, 1802 | os-string installed, 1803 | overhang ==1.0.0, 1804 | packcheck ==0.7.0, 1805 | pager ==0.1.1.0, 1806 | pagination ==0.2.2, 1807 | pagure ==0.2.1, 1808 | pagure-cli ==0.2.2, 1809 | palette ==0.3.0.4, 1810 | pandoc ==3.6.1, 1811 | pandoc-cli ==3.6.1, 1812 | pandoc-lua-engine ==0.4.1, 1813 | pandoc-lua-marshal ==0.3.0, 1814 | pandoc-plot ==1.9.1, 1815 | pandoc-server ==0.1.0.10, 1816 | pandoc-throw ==0.1.0.0, 1817 | pandoc-types ==1.23.1, 1818 | pango ==0.13.11.0, 1819 | panic ==0.4.0.1, 1820 | parallel ==3.2.2.0, 1821 | parameterized ==0.5.0.0, 1822 | parameterized-utils ==2.1.9.0, 1823 | park-bench ==0.1.1.0, 1824 | parseargs ==0.2.0.9, 1825 | parsec installed, 1826 | parsec-class ==1.0.1.0, 1827 | parsec-numbers ==0.1.0, 1828 | parsec-numeric ==0.1.0.0, 1829 | ParsecTools ==0.0.2.0, 1830 | parser-combinators ==1.3.0, 1831 | parser-combinators-tests ==1.3.0, 1832 | parser-regex ==0.2.0.1, 1833 | parsers ==0.12.12, 1834 | partial-handler ==1.0.3, 1835 | partial-isomorphisms ==0.2.4.0, 1836 | partialord ==0.0.2, 1837 | password ==3.1.0.1, 1838 | password-instances ==3.0.0.0, 1839 | password-types ==1.0.0.0, 1840 | path-pieces ==0.2.1, 1841 | pathtype ==0.8.1.3, 1842 | pathwalk ==0.3.1.2, 1843 | patience ==0.3, 1844 | patrol ==1.0.0.8, 1845 | pava ==0.1.1.4, 1846 | pcg-random ==0.1.4.0, 1847 | pcre2 ==2.2.1, 1848 | pcre-heavy ==1.0.0.3, 1849 | pcre-light ==0.4.1.2, 1850 | pcre-utils ==0.1.9, 1851 | pdc ==0.1.1, 1852 | pdf-toolbox-content ==0.1.2, 1853 | pdf-toolbox-core ==0.1.3, 1854 | pdf-toolbox-document ==0.1.4, 1855 | peano ==0.1.0.2, 1856 | pem ==0.2.4, 1857 | percent-format ==0.0.4, 1858 | perf ==0.14.0.1, 1859 | perfect-hash-generator ==1.0.0, 1860 | persistable-record ==0.6.0.6, 1861 | persistable-types-HDBC-pg ==0.0.3.5, 1862 | persistent ==2.14.6.3, 1863 | persistent-discover ==0.1.0.7, 1864 | persistent-documentation ==0.1.0.5, 1865 | persistent-lens ==1.0.0, 1866 | persistent-mongoDB ==2.13.1.0, 1867 | persistent-mtl ==0.5.1, 1868 | persistent-mysql ==2.13.1.5, 1869 | persistent-pagination ==0.1.1.2, 1870 | persistent-postgresql ==2.13.6.2, 1871 | persistent-qq ==2.12.0.6, 1872 | persistent-redis ==2.13.0.2, 1873 | persistent-sqlite ==2.13.3.0, 1874 | persistent-template ==2.12.0.0, 1875 | persistent-test ==2.13.1.3, 1876 | persistent-typed-db ==0.1.0.7, 1877 | pg-harness-client ==0.6.0, 1878 | pg-transact ==0.3.2.0, 1879 | phantom-state ==0.2.1.4, 1880 | pid1 ==0.1.3.1, 1881 | pinch ==0.5.2.0, 1882 | pipes ==4.3.16, 1883 | pipes-aeson ==0.4.2, 1884 | pipes-attoparsec ==0.6.0, 1885 | pipes-binary ==0.4.4, 1886 | pipes-bytestring ==2.1.7, 1887 | pipes-concurrency ==2.0.14, 1888 | pipes-csv ==1.4.3, 1889 | pipes-extras ==1.0.15, 1890 | pipes-fastx ==0.3.0.0, 1891 | pipes-fluid ==0.6.0.1, 1892 | pipes-group ==1.0.12, 1893 | pipes-mongodb ==0.1.0.0, 1894 | pipes-ordered-zip ==1.2.1, 1895 | pipes-parse ==3.0.9, 1896 | pipes-random ==1.0.0.5, 1897 | pipes-safe ==2.3.5, 1898 | pipes-wai ==3.2.0, 1899 | pipes-zlib ==0.4.4.2, 1900 | pkgtreediff ==0.6.0, 1901 | placeholders ==0.1, 1902 | plaid ==0.1.0.4, 1903 | plot ==0.2.3.12, 1904 | plotlyhs ==0.2.3, 1905 | Plural ==0.0.2, 1906 | pointed ==5.0.5, 1907 | pointedlist ==0.6.1, 1908 | pointless-fun ==1.1.0.8, 1909 | poll ==0.0.0.2, 1910 | poly ==0.5.1.0, 1911 | poly-arity ==0.1.0, 1912 | polynomials-bernstein ==1.1.2, 1913 | polyparse ==1.13, 1914 | polysemy ==1.9.2.0, 1915 | polysemy-plugin ==0.4.5.2, 1916 | polysemy-webserver ==0.2.1.2, 1917 | pooled-io ==0.0.2.3, 1918 | portable-lines ==0.1, 1919 | port-utils ==0.2.1.0, 1920 | posix-paths ==0.3.0.0, 1921 | posix-pty ==0.2.2, 1922 | possibly ==1.0.0.0, 1923 | postgres-options ==0.2.2.0, 1924 | postgresql-binary ==0.14, 1925 | postgresql-libpq ==0.11.0.0, 1926 | postgresql-libpq-configure ==0.11, 1927 | postgresql-libpq-notify ==0.2.0.0, 1928 | postgresql-migration ==0.2.1.8, 1929 | postgresql-schema ==0.1.14, 1930 | postgresql-simple ==0.7.0.0, 1931 | postgresql-syntax ==0.4.1.1, 1932 | postgresql-typed ==0.6.2.5, 1933 | post-mess-age ==0.2.1.0, 1934 | pptable ==0.3.0.0, 1935 | pqueue ==1.5.0.0, 1936 | pred-set ==0.0.1, 1937 | prefix-units ==0.3.0.1, 1938 | prelude-compat ==0.0.0.2, 1939 | prelude-safeenum ==0.1.1.3, 1940 | pretty installed, 1941 | prettychart ==0.3.0.0, 1942 | pretty-class ==1.0.1.1, 1943 | prettyclass ==1.0.0.0, 1944 | pretty-hex ==1.1, 1945 | prettyprinter ==1.7.1, 1946 | prettyprinter-ansi-terminal ==1.1.3, 1947 | prettyprinter-combinators ==0.1.3, 1948 | prettyprinter-compat-annotated-wl-pprint ==1.1, 1949 | prettyprinter-compat-ansi-wl-pprint ==1.0.2, 1950 | prettyprinter-compat-wl-pprint ==1.0.1, 1951 | prettyprinter-interp ==0.2.0.0, 1952 | pretty-relative-time ==0.3.0.0, 1953 | pretty-show ==1.10, 1954 | pretty-simple ==4.1.3.0, 1955 | pretty-sop ==0.2.0.3, 1956 | pretty-terminal ==0.1.0.0, 1957 | primecount ==0.1.0.2, 1958 | primes ==0.2.1.0, 1959 | primitive ==0.9.0.0, 1960 | primitive-addr ==0.1.0.3, 1961 | primitive-extras ==0.10.2.1, 1962 | primitive-offset ==0.2.0.1, 1963 | primitive-serial ==0.1, 1964 | primitive-unaligned ==0.1.1.2, 1965 | primitive-unlifted ==2.2.0.0, 1966 | prim-uniq ==0.2, 1967 | print-console-colors ==0.1.0.0, 1968 | probability ==0.2.8, 1969 | process installed, 1970 | process-extras ==0.7.4, 1971 | product-isomorphic ==0.0.3.4, 1972 | product-profunctors ==0.11.1.1, 1973 | profunctors ==5.6.2, 1974 | projectroot ==0.2.0.1, 1975 | project-template ==0.2.1.0, 1976 | prometheus ==2.3.0, 1977 | prometheus-client ==1.1.1, 1978 | prometheus-metrics-ghc ==1.0.1.2, 1979 | promises ==0.3, 1980 | prospect ==0.1.0.0, 1981 | protobuf ==0.2.1.3, 1982 | protobuf-simple ==0.1.1.1, 1983 | protocol-radius ==0.0.1.2, 1984 | protocol-radius-test ==0.1.0.1, 1985 | proxied ==0.3.2, 1986 | psql-helpers ==0.1.0.0, 1987 | PSQueue ==1.2.0, 1988 | psqueues ==0.2.8.0, 1989 | pthread ==0.2.1, 1990 | ptr ==0.16.8.6, 1991 | ptr-poker ==0.1.2.16, 1992 | pulse-simple ==0.1.14, 1993 | pureMD5 ==2.1.4, 1994 | purescript-bridge ==0.15.0.0, 1995 | pusher-http-haskell ==2.1.0.20, 1996 | pvar ==1.0.0.0, 1997 | pwstore-fast ==2.4.4, 1998 | PyF ==0.11.3.0, 1999 | qchas ==1.1.0.1, 2000 | quadratic-irrational ==0.1.1, 2001 | QuasiText ==0.1.2.6, 2002 | queues ==1.0.0, 2003 | quickbench ==1.0.1, 2004 | QuickCheck ==2.15.0.1, 2005 | quickcheck-arbitrary-adt ==0.3.1.0, 2006 | quickcheck-assertions ==0.3.0, 2007 | quickcheck-classes ==0.6.5.0, 2008 | quickcheck-classes-base ==0.6.2.0, 2009 | quickcheck-groups ==0.0.1.3, 2010 | quickcheck-higherorder ==0.1.0.1, 2011 | quickcheck-instances ==0.3.32, 2012 | quickcheck-io ==0.2.0, 2013 | quickcheck-monoid-subclasses ==0.3.0.4, 2014 | quickcheck-quid ==0.0.1.6, 2015 | quickcheck-simple ==0.1.1.1, 2016 | quickcheck-state-machine ==0.10.1, 2017 | quickcheck-text ==0.1.2.1, 2018 | quickcheck-transformer ==0.3.1.2, 2019 | quickcheck-unicode ==1.0.1.0, 2020 | quicklz ==1.5.0.11, 2021 | quiet ==0.2, 2022 | quote-quot ==0.2.1.0, 2023 | radius ==0.7.1.0, 2024 | radix-tree ==1.1.0.0, 2025 | rainbow ==0.34.2.2, 2026 | rainbox ==0.26.0.0, 2027 | ral ==0.2.2, 2028 | rampart ==2.0.0.8, 2029 | ramus ==0.1.2, 2030 | rando ==0.0.0.4, 2031 | random ==1.2.1.3, 2032 | random-bytestring ==0.1.4, 2033 | random-fu ==0.3.0.1, 2034 | random-shuffle ==0.0.4, 2035 | random-tree ==0.6.0.5, 2036 | range ==0.3.0.2, 2037 | ranged-list ==0.1.2.3, 2038 | Ranged-sets ==0.4.0, 2039 | ranges ==0.2.4, 2040 | range-set-list ==0.1.4, 2041 | rank1dynamic ==0.4.2, 2042 | Rasterific ==0.7.5.4, 2043 | rasterific-svg ==0.3.3.2, 2044 | ratel ==2.0.0.12, 2045 | rate-limit ==1.4.3, 2046 | ratel-wai ==2.0.0.7, 2047 | ratio-int ==0.1.2, 2048 | rattle ==0.2, 2049 | rattletrap ==14.1.0, 2050 | rawfilepath ==1.1.1, 2051 | rawstring-qm ==0.2.3.0, 2052 | raw-strings-qq ==1.1, 2053 | rcu ==0.2.7, 2054 | rdf ==0.1.0.8, 2055 | rdtsc ==1.3.0.1, 2056 | readable ==0.3.1, 2057 | read-editor ==0.1.0.2, 2058 | read-env-var ==1.0.0.0, 2059 | real-dice ==0.1.0.4, 2060 | rebase ==1.21.1, 2061 | rec-def ==0.2.2, 2062 | record-hasfield ==1.0.1, 2063 | recursion-schemes ==5.2.3, 2064 | recv ==0.1.0, 2065 | reddit-scrape ==0.0.1, 2066 | redis-resp ==1.0.0, 2067 | reducers ==3.12.5, 2068 | refact ==0.3.0.2, 2069 | ref-fd ==0.5.0.1, 2070 | refined ==0.8.2, 2071 | reflection ==2.1.9, 2072 | RefSerialize ==0.4.0, 2073 | ref-tf ==0.5.0.1, 2074 | regex ==1.1.0.2, 2075 | regex-base ==0.94.0.2, 2076 | regex-compat ==0.95.2.1, 2077 | regex-pcre ==0.95.0.0, 2078 | regex-pcre-builtin ==0.95.2.3.8.44, 2079 | regex-posix ==0.96.0.1, 2080 | regex-posix-clib ==2.7, 2081 | regex-tdfa ==1.3.2.2, 2082 | regex-with-pcre ==1.1.0.2, 2083 | reinterpret-cast ==0.1.0, 2084 | rel8 ==1.6.0.0, 2085 | relapse ==1.0.0.1, 2086 | relational-query ==0.12.3.1, 2087 | relational-query-HDBC ==0.7.2.1, 2088 | relational-record ==0.2.2.0, 2089 | relational-schemas ==0.1.8.1, 2090 | reliable-io ==0.0.2, 2091 | relude ==1.2.2.0, 2092 | renderable ==0.2.0.1, 2093 | reorder-expression ==0.1.0.2, 2094 | repa ==3.4.2.0, 2095 | repa-algorithms ==3.4.2.0, 2096 | repa-io ==3.4.2.0, 2097 | replace-attoparsec ==1.5.0.0, 2098 | replace-megaparsec ==1.5.0.1, 2099 | req ==3.13.4, 2100 | req-conduit ==1.0.2, 2101 | rerebase ==1.21.1, 2102 | reroute ==0.7.0.0, 2103 | resolv ==0.2.0.2, 2104 | resource-pool ==0.4.0.0, 2105 | resourcet ==1.3.0, 2106 | rest-rewrite ==0.4.4, 2107 | result ==0.2.6.0, 2108 | retry ==0.9.3.1, 2109 | rev-state ==0.2.0.1, 2110 | rex ==0.6.2, 2111 | rfc1751 ==0.1.3, 2112 | rfc5051 ==0.2, 2113 | rg ==1.4.0.0, 2114 | richenv ==0.1.0.2, 2115 | rio ==0.1.22.0, 2116 | rio-orphans ==0.1.2.0, 2117 | rng-utils ==0.3.1, 2118 | roc-id ==0.2.0.3, 2119 | rocksdb-haskell ==1.0.1, 2120 | rocksdb-haskell-jprupp ==2.1.6, 2121 | rocksdb-query ==0.4.2, 2122 | roles ==0.2.1.0, 2123 | rollbar ==1.1.3, 2124 | rope-utf16-splay ==0.4.0.0, 2125 | rosezipper ==0.2, 2126 | rot13 ==0.2.0.1, 2127 | RoundingFiasco ==0.1.0.0, 2128 | row-types ==1.0.1.2, 2129 | rpmbuild-order ==0.4.12, 2130 | rpm-nvr ==0.1.2, 2131 | rp-tree ==0.7.1, 2132 | rrb-vector ==0.2.2.1, 2133 | RSA ==2.4.1, 2134 | rss ==3000.2.0.8, 2135 | rss-conduit ==0.6.0.1, 2136 | runmemo ==1.0.0.1, 2137 | run-st ==0.1.3.3, 2138 | rvar ==0.3.0.2, 2139 | s3-signer ==0.5.0.0, 2140 | safe ==0.3.21, 2141 | safe-coloured-text ==0.3.0.2, 2142 | safe-coloured-text-gen ==0.0.0.3, 2143 | safe-coloured-text-layout ==0.2.0.1, 2144 | safe-coloured-text-layout-gen ==0.0.0.1, 2145 | safe-coloured-text-terminfo ==0.3.0.0, 2146 | safecopy ==0.10.4.2, 2147 | safe-decimal ==0.2.1.0, 2148 | safe-exceptions ==0.1.7.4, 2149 | safe-foldable ==0.1.0.0, 2150 | safe-gen ==1.0.1, 2151 | safeio ==0.0.6.0, 2152 | safe-json ==1.2.0.2, 2153 | safe-money ==0.9.1, 2154 | SafeSemaphore ==0.10.1, 2155 | salve ==2.0.0.5, 2156 | sample-frame ==0.0.4, 2157 | sample-frame-np ==0.0.5, 2158 | sampling ==0.3.5, 2159 | samsort ==0.1.0.0, 2160 | sandi ==0.5, 2161 | sandwich ==0.3.0.2, 2162 | sandwich-contexts ==0.3.0.1, 2163 | sandwich-hedgehog ==0.1.3.1, 2164 | sandwich-quickcheck ==0.1.0.7, 2165 | sandwich-slack ==0.1.2.0, 2166 | sandwich-webdriver ==0.3.0.0, 2167 | saturn ==1.0.0.5, 2168 | say ==0.1.0.1, 2169 | sayable ==1.2.5.0, 2170 | sbp ==6.2.1, 2171 | sbv ==11.0, 2172 | scalpel ==0.6.2.2, 2173 | scalpel-core ==0.6.2.2, 2174 | scanf ==0.1.0.0, 2175 | scanner ==0.3.1, 2176 | s-cargot ==0.1.6.0, 2177 | scheduler ==2.0.0.1, 2178 | SciBaseTypes ==0.1.1.0, 2179 | scientific ==0.3.8.0, 2180 | scientist ==0.0.0.0, 2181 | scotty ==0.22, 2182 | scrypt ==0.5.0, 2183 | search-algorithms ==0.3.3, 2184 | secp256k1-haskell ==1.4.2, 2185 | securemem ==0.1.10, 2186 | selections ==0.3.0.0, 2187 | selective ==0.7.0.1, 2188 | select-rpms ==0.2.0, 2189 | semaphore-compat installed, 2190 | semialign ==1.3.1, 2191 | semigroupoids ==6.0.1, 2192 | semigroups ==0.20, 2193 | semirings ==0.7, 2194 | semiring-simple ==1.0.0.1, 2195 | semver ==0.4.0.1, 2196 | sendfile ==0.7.11.6, 2197 | sendgrid-v3 ==1.0.0.1, 2198 | seqalign ==0.2.0.4, 2199 | seqid ==0.6.3, 2200 | seqid-streams ==0.7.2, 2201 | sequence-formats ==1.10.0.0, 2202 | sequenceTools ==1.5.3.1, 2203 | serialise ==0.2.6.1, 2204 | servant ==0.20.2, 2205 | servant-auth ==0.4.2.0, 2206 | servant-auth-client ==0.4.2.0, 2207 | servant-auth-docs ==0.2.11.0, 2208 | servant-blaze ==0.9.1, 2209 | servant-checked-exceptions ==2.2.0.1, 2210 | servant-checked-exceptions-core ==2.2.0.1, 2211 | servant-cli ==0.1.1.0, 2212 | servant-client ==0.20.2, 2213 | servant-client-core ==0.20.2, 2214 | servant-conduit ==0.16.1, 2215 | servant-docs ==0.13.1, 2216 | servant-elm ==0.7.3, 2217 | servant-exceptions ==0.2.1, 2218 | servant-exceptions-server ==0.2.1, 2219 | servant-foreign ==0.16.1, 2220 | servant-http-streams ==0.20.2, 2221 | servant-JuicyPixels ==0.3.1.1, 2222 | servant-lucid ==0.9.0.6, 2223 | servant-machines ==0.16.1, 2224 | servant-multipart ==0.12.1, 2225 | servant-multipart-api ==0.12.1, 2226 | servant-multipart-client ==0.12.2, 2227 | servant-pipes ==0.16.1, 2228 | servant-rate-limit ==0.2.0.0, 2229 | servant-rawm ==1.0.0.0, 2230 | servant-server ==0.20.2, 2231 | servant-static-th ==1.0.0.1, 2232 | servant-swagger-ui ==0.3.5.5.0.1, 2233 | servant-swagger-ui-core ==0.3.5, 2234 | servant-websockets ==2.0.0, 2235 | servant-xml ==1.0.3, 2236 | serversession ==1.0.3, 2237 | serversession-backend-acid-state ==1.0.5, 2238 | serversession-backend-persistent ==2.0.3, 2239 | serversession-backend-redis ==1.0.5, 2240 | serversession-frontend-wai ==1.0.1, 2241 | serversession-frontend-yesod ==1.0.1, 2242 | servius ==1.2.3.0, 2243 | ses-html ==0.4.0.0, 2244 | set-cover ==0.1.1.1, 2245 | setenv ==0.1.1.3, 2246 | setlocale ==1.0.0.10, 2247 | sexp-grammar ==2.3.4.2, 2248 | SHA ==1.6.4.4, 2249 | shake ==0.19.8, 2250 | shakespeare ==2.1.1, 2251 | shakespeare-text ==1.1.0, 2252 | shared-memory ==0.2.0.1, 2253 | ShellCheck ==0.10.0, 2254 | shell-conduit ==5.0.0, 2255 | shell-escape ==0.2.0, 2256 | shellify ==0.11.0.5, 2257 | shellmet ==0.0.5.0, 2258 | shelltestrunner ==1.10, 2259 | shell-utility ==0.1, 2260 | shellwords ==0.1.4.0, 2261 | shelly ==1.12.1, 2262 | should-not-typecheck ==2.1.0, 2263 | show-combinators ==0.2.0.0, 2264 | siggy-chardust ==1.0.0, 2265 | signal ==0.1.0.4, 2266 | silently ==1.2.5.4, 2267 | simple ==2.0.0, 2268 | simple-affine-space ==0.2.1, 2269 | simple-cabal ==0.1.3.1, 2270 | simple-cairo ==0.1.0.6, 2271 | simple-cmd ==0.2.7, 2272 | simple-cmd-args ==0.1.8, 2273 | simple-expr ==0.1.1.0, 2274 | simple-media-timestamp ==0.2.1.0, 2275 | simple-media-timestamp-attoparsec ==0.1.0.0, 2276 | simple-pango ==0.1.0.2, 2277 | simple-prompt ==0.2.3, 2278 | simple-reflect ==0.3.3, 2279 | simple-sendfile ==0.2.32, 2280 | simple-session ==2.0.0, 2281 | simple-templates ==2.0.0, 2282 | simple-vec3 ==0.6.0.1, 2283 | since ==0.0.0, 2284 | singleraeh ==0.4.0, 2285 | singleton-bool ==0.1.8, 2286 | singleton-nats ==0.4.7, 2287 | singletons ==3.0.4, 2288 | singletons-base ==3.4, 2289 | singletons-presburger ==0.7.4.0, 2290 | singletons-th ==3.4, 2291 | Sit ==0.2023.8.3, 2292 | sitemap-gen ==0.1.0.0, 2293 | size-based ==0.1.3.3, 2294 | sized ==1.1.0.2, 2295 | skein ==1.0.9.4, 2296 | skews ==0.1.0.3, 2297 | skip-var ==0.1.1.0, 2298 | skylighting ==0.14.5, 2299 | skylighting-core ==0.14.5, 2300 | skylighting-format-ansi ==0.1, 2301 | skylighting-format-blaze-html ==0.1.1.3, 2302 | skylighting-format-context ==0.1.0.2, 2303 | skylighting-format-latex ==0.1, 2304 | slave-thread ==1.1.0.3, 2305 | slick ==1.3.1.0, 2306 | slist ==0.2.1.0, 2307 | slynx ==0.8.0.0, 2308 | smallcheck ==1.2.1.1, 2309 | smtp-mail ==0.5.0.0, 2310 | snap ==1.1.3.3, 2311 | snap-blaze ==0.2.1.5, 2312 | snap-core ==1.0.5.1, 2313 | snap-server ==1.1.2.1, 2314 | snowflake ==0.1.1.1, 2315 | socks ==0.6.1, 2316 | some ==1.0.6, 2317 | some-dict-of ==0.1.0.2, 2318 | sop-core ==0.5.0.2, 2319 | sort ==1.0.0.0, 2320 | sorted-list ==0.2.2.0, 2321 | sound-collage ==0.2.1, 2322 | sourcemap ==0.1.7, 2323 | sox ==0.2.3.2, 2324 | soxlib ==0.0.3.2, 2325 | speculate ==0.4.20, 2326 | specup ==0.2.0.4, 2327 | speedy-slice ==0.3.2, 2328 | sphinx ==0.6.1, 2329 | Spintax ==0.3.7.0, 2330 | splice ==0.6.1.1, 2331 | split ==0.2.5, 2332 | splitmix ==0.1.1, 2333 | splitmix-distributions ==1.0.0, 2334 | split-record ==0.1.1.4, 2335 | Spock-api ==0.14.0.0, 2336 | spoon ==0.3.1, 2337 | spreadsheet ==0.1.3.10, 2338 | sqids ==0.2.2.0, 2339 | sqlite-simple ==0.4.19.0, 2340 | sql-words ==0.1.6.5, 2341 | squeather ==0.8.0.0, 2342 | srcloc ==0.6.0.1, 2343 | srtree ==2.0.0.2, 2344 | stache ==2.3.4, 2345 | stack-all ==0.6.4, 2346 | stack-clean-old ==0.5.1, 2347 | stack-templatizer ==0.1.1.0, 2348 | stamina ==0.1.0.3, 2349 | state-codes ==0.1.3, 2350 | stateref ==0.3, 2351 | statestack ==0.3.1.1, 2352 | StateVar ==1.2.2, 2353 | stateWriter ==0.4.0, 2354 | static-bytes ==0.1.1, 2355 | static-text ==0.2.0.7, 2356 | statistics ==0.16.2.1, 2357 | statistics-linreg ==0.3, 2358 | status-notifier-item ==0.3.1.0, 2359 | step-function ==0.2.1, 2360 | stitch ==0.6.0.0, 2361 | stm installed, 2362 | stm-chans ==3.0.0.9, 2363 | stm-conduit ==4.0.1, 2364 | stm-containers ==1.2.1, 2365 | stm-delay ==0.1.1.1, 2366 | stm-extras ==0.1.0.3, 2367 | stm-hamt ==1.2.1, 2368 | STMonadTrans ==0.4.8, 2369 | stm-split ==0.0.2.1, 2370 | storable-complex ==0.2.3.0, 2371 | storable-endian ==0.2.6.1, 2372 | storable-generic ==0.1.0.5, 2373 | storable-hetero-list ==0.1.0.4, 2374 | storable-peek-poke ==0.1.0.2, 2375 | storable-record ==0.0.7, 2376 | storable-tuple ==0.1, 2377 | storablevector ==0.2.13.2, 2378 | store ==0.7.20, 2379 | store-core ==0.4.4.7, 2380 | store-streaming ==0.2.0.5, 2381 | stratosphere ==0.60.0, 2382 | Stream ==0.4.7.2, 2383 | streaming ==0.2.4.0, 2384 | streaming-attoparsec ==1.0.0.1, 2385 | streaming-bytestring ==0.3.3, 2386 | streaming-commons ==0.2.2.6, 2387 | streaming-wai ==0.1.1, 2388 | streams ==3.3.3, 2389 | strict ==0.5.1, 2390 | strict-base-types ==0.8.1, 2391 | strict-concurrency ==0.2.4.3, 2392 | strict-lens ==0.4.1, 2393 | strict-list ==0.1.7.5, 2394 | strict-mutable-base ==1.1.0.0, 2395 | strict-tuple ==0.1.5.4, 2396 | strict-wrapper ==0.0.1.0, 2397 | stringable ==0.1.3, 2398 | stringbuilder ==0.5.1, 2399 | string-class ==0.1.7.2, 2400 | string-combinators ==0.6.0.5, 2401 | string-conv ==0.2.0, 2402 | string-conversions ==0.4.0.1, 2403 | string-interpolate ==0.3.4.0, 2404 | stringprep ==1.0.0, 2405 | string-qq ==0.0.6, 2406 | stringsearch ==0.3.6.6, 2407 | string-transform ==1.1.1, 2408 | string-variants ==0.3.1.1, 2409 | strive ==6.0.0.13, 2410 | structs ==0.1.9, 2411 | subcategories ==0.2.1.1, 2412 | sundown ==0.6, 2413 | svg-builder ==0.1.1, 2414 | SVGFonts ==1.8.0.1, 2415 | svg-tree ==0.6.2.4, 2416 | swish ==0.10.10.0, 2417 | syb ==0.7.2.4, 2418 | symbol ==0.2.4.1, 2419 | symengine ==0.1.2.0, 2420 | symmetry-operations-symbols ==0.0.2.1, 2421 | synthesizer-alsa ==0.5.0.6, 2422 | synthesizer-core ==0.8.4, 2423 | synthesizer-dimensional ==0.8.1.1, 2424 | synthesizer-midi ==0.6.1.2, 2425 | sysinfo ==0.1.1, 2426 | system-argv0 ==0.1.1, 2427 | systemd ==2.4.0, 2428 | system-fileio ==0.3.16.6, 2429 | system-filepath ==0.4.14.1, 2430 | system-info ==0.5.2, 2431 | system-linux-proc ==0.1.1.1, 2432 | tabular ==0.2.2.8, 2433 | tagchup ==0.4.1.2, 2434 | tagged ==0.8.9, 2435 | tagged-binary ==0.2.0.1, 2436 | tagged-identity ==0.1.4, 2437 | tagged-transformer ==0.8.3, 2438 | tagsoup ==0.14.8, 2439 | tagstream-conduit ==0.5.6, 2440 | tao ==1.0.0, 2441 | tao-example ==1.0.0, 2442 | tar ==0.6.3.0, 2443 | tar-conduit ==0.4.1, 2444 | tardis ==0.5.0, 2445 | tasty ==1.5.2, 2446 | tasty-ant-xml ==1.1.9, 2447 | tasty-autocollect ==0.4.4, 2448 | tasty-bench ==0.4.1, 2449 | tasty-checklist ==1.0.6.0, 2450 | tasty-dejafu ==2.1.0.1, 2451 | tasty-discover ==5.0.0, 2452 | tasty-expected-failure ==0.12.3, 2453 | tasty-fail-fast ==0.0.3, 2454 | tasty-focus ==1.0.1, 2455 | tasty-golden ==2.3.5, 2456 | tasty-hedgehog ==1.4.0.2, 2457 | tasty-hslua ==1.1.1, 2458 | tasty-hspec ==1.2.0.4, 2459 | tasty-html ==0.4.2.2, 2460 | tasty-hunit ==0.10.2, 2461 | tasty-inspection-testing ==0.2.1, 2462 | tasty-kat ==0.0.3, 2463 | tasty-leancheck ==0.0.2, 2464 | tasty-lua ==1.1.1, 2465 | tasty-papi ==0.1.2.0, 2466 | tasty-program ==1.1.0, 2467 | tasty-quickcheck ==0.11, 2468 | tasty-rerun ==1.1.19, 2469 | tasty-silver ==3.3.2, 2470 | tasty-smallcheck ==0.8.2, 2471 | tasty-sugar ==2.2.2.0, 2472 | tasty-tap ==0.1.0, 2473 | tasty-th ==0.1.7, 2474 | TCache ==0.13.3, 2475 | tce-conf ==1.3, 2476 | tdigest ==0.3.1, 2477 | teardown ==0.5.0.1, 2478 | telegram-bot-api ==7.4.4, 2479 | telegram-bot-simple ==0.14.4, 2480 | tempgres-client ==1.0.0, 2481 | template ==0.2.0.10, 2482 | template-haskell installed, 2483 | template-haskell-compat-v0208 ==0.1.9.4, 2484 | temporary ==1.3, 2485 | temporary-rc ==1.2.0.3, 2486 | temporary-resourcet ==0.1.0.1, 2487 | tensorflow-test ==0.1.0.0, 2488 | tensort ==1.0.1.3, 2489 | termbox ==2.0.0.1, 2490 | termbox-bindings-c ==0.1.0.1, 2491 | termbox-bindings-hs ==1.0.0, 2492 | termbox-tea ==1.0.0, 2493 | terminal ==0.2.0.0, 2494 | terminal-progress-bar ==0.4.2, 2495 | terminal-size ==0.3.4, 2496 | terminfo installed, 2497 | test-certs ==0.1.1.1, 2498 | test-framework ==0.8.2.0, 2499 | test-framework-hunit ==0.3.0.2, 2500 | test-framework-leancheck ==0.0.4, 2501 | test-framework-quickcheck2 ==0.3.0.5, 2502 | test-framework-smallcheck ==0.2, 2503 | test-fun ==0.1.0.0, 2504 | testing-feat ==1.1.1.1, 2505 | testing-type-modifiers ==0.1.0.1, 2506 | texmath ==0.12.8.12, 2507 | text installed, 2508 | text-ansi ==0.3.0.1, 2509 | text-binary ==0.2.1.1, 2510 | text-builder ==0.6.7.2, 2511 | text-builder-dev ==0.3.9, 2512 | text-builder-linear ==0.1.3, 2513 | text-conversions ==0.3.1.1, 2514 | text-icu ==0.8.0.5, 2515 | text-iso8601 ==0.1.1, 2516 | text-latin1 ==0.3.1, 2517 | text-ldap ==0.1.1.14, 2518 | textlocal ==0.1.0.5, 2519 | text-manipulate ==0.3.1.0, 2520 | text-metrics ==0.3.3, 2521 | text-misc-yj ==0.1.0.2, 2522 | text-postgresql ==0.0.3.1, 2523 | text-printer ==0.5.0.2, 2524 | text-regex-replace ==0.1.1.5, 2525 | text-rope ==0.3, 2526 | text-short ==0.1.6, 2527 | text-show ==3.11.1, 2528 | text-show-instances ==3.9.10, 2529 | text-zipper ==0.13, 2530 | tfp ==1.0.2, 2531 | tf-random ==0.5, 2532 | th-abstraction ==0.7.1.0, 2533 | th-bang-compat ==0.0.1.0, 2534 | th-compat ==0.1.6, 2535 | th-constraint-compat ==0.0.1.0, 2536 | th-data-compat ==0.1.3.1, 2537 | th-deepstrict ==0.1.1.0, 2538 | th-desugar ==1.18, 2539 | th-env ==0.1.1, 2540 | these ==1.2.1, 2541 | these-lens ==1.0.2, 2542 | these-optics ==1.0.2, 2543 | these-skinny ==0.7.6, 2544 | th-expand-syns ==0.4.12.0, 2545 | th-extras ==0.0.0.8, 2546 | th-lego ==0.3.0.3, 2547 | th-lift ==0.8.6, 2548 | th-lift-instances ==0.1.20, 2549 | th-nowq ==0.1.0.5, 2550 | th-orphans ==0.13.16, 2551 | th-printf ==0.8, 2552 | thread-hierarchy ==0.3.0.2, 2553 | thread-local-storage ==0.2, 2554 | threads ==0.5.1.8, 2555 | threads-extras ==0.1.0.3, 2556 | thread-supervisor ==0.2.0.0, 2557 | th-reify-compat ==0.0.1.5, 2558 | th-reify-many ==0.1.10, 2559 | th-strict-compat ==0.1.0.1, 2560 | th-utilities ==0.2.5.0, 2561 | thyme ==0.4.1, 2562 | tidal ==1.9.5, 2563 | tidal-link ==1.0.3, 2564 | tile ==0.3.0.0, 2565 | time installed, 2566 | time-compat ==1.9.8, 2567 | time-domain ==0.1.0.5, 2568 | timeit ==2.0, 2569 | time-lens ==0.4.0.2, 2570 | timelens ==0.2.0.2, 2571 | time-locale-compat ==0.1.1.5, 2572 | time-locale-vietnamese ==1.0.0.0, 2573 | time-manager ==0.2.2, 2574 | timerep ==2.1.0.0, 2575 | timers-tick ==0.5.0.4, 2576 | timer-wheel ==1.0.0.1, 2577 | timespan ==0.4.0.0, 2578 | time-units ==1.0.0, 2579 | time-units-types ==0.2.0.1, 2580 | timezone-olson ==0.2.1, 2581 | timezone-olson-th ==0.1.0.11, 2582 | timezone-series ==0.1.13, 2583 | titlecase ==1.0.1, 2584 | tldr ==0.9.2, 2585 | tls ==2.1.5, 2586 | tls-session-manager ==0.0.7, 2587 | tlynx ==0.8.0.0, 2588 | tmapchan ==0.0.3, 2589 | tmapmvar ==0.0.4, 2590 | tmp-proc ==0.7.2.1, 2591 | tmp-proc-postgres ==0.7.0.0, 2592 | tmp-proc-redis ==0.7.0.0, 2593 | token-bucket ==0.1.0.1, 2594 | tokenize ==0.3.0.1, 2595 | tomland ==1.3.3.3, 2596 | toml-parser ==2.0.1.0, 2597 | toml-reader ==0.2.1.0, 2598 | toml-reader-parse ==0.1.1.1, 2599 | tools-yj ==0.1.0.20, 2600 | tophat ==1.0.8.0, 2601 | topograph ==1.0.1, 2602 | torrent ==10000.1.3, 2603 | torsor ==0.1.0.1, 2604 | tracing ==0.0.7.4, 2605 | transaction ==0.1.1.4, 2606 | transformers installed, 2607 | transformers-base ==0.4.6, 2608 | transformers-compat ==0.7.2, 2609 | transformers-either ==0.1.4, 2610 | traverse-with-class ==1.0.1.1, 2611 | tree-diff ==0.3.3, 2612 | tree-fun ==0.8.1.0, 2613 | tree-view ==0.5.1, 2614 | trie-simple ==0.4.3, 2615 | trifecta ==2.1.4, 2616 | trimdent ==0.1.0.0, 2617 | trivial-constraint ==0.7.0.0, 2618 | tsv2csv ==0.1.0.2, 2619 | ttc ==1.4.0.0, 2620 | ttrie ==0.1.2.2, 2621 | tuple ==0.3.0.2, 2622 | tuples ==0.1.0.0, 2623 | tuples-homogenous-h98 ==0.1.1.0, 2624 | tuple-sop ==0.3.1.0, 2625 | tuple-th ==0.2.5, 2626 | turtle ==1.6.2, 2627 | twitter-types ==0.11.0, 2628 | twitter-types-lens ==0.11.0, 2629 | typecheck-plugin-nat-simple ==0.1.0.11, 2630 | typed-process ==0.2.12.0, 2631 | typed-uuid ==0.2.0.0, 2632 | type-equality ==1.0.1, 2633 | type-errors ==0.2.0.2, 2634 | type-flip ==0.1.0.0, 2635 | type-fun ==0.1.3, 2636 | type-hint ==0.1, 2637 | type-level-integers ==0.0.1, 2638 | type-level-kv-list ==2.0.2.0, 2639 | type-level-natural-number ==2.0, 2640 | type-level-numbers ==0.1.1.2, 2641 | typelevel-tools-yj ==0.1.0.7, 2642 | typelits-witnesses ==0.4.1.0, 2643 | type-map ==0.1.7.0, 2644 | type-natural ==1.3.0.1, 2645 | typenums ==0.1.4, 2646 | type-of-html ==1.6.2.0, 2647 | type-of-html-static ==0.1.0.2, 2648 | type-rig ==0.1, 2649 | type-set ==0.1.0.0, 2650 | type-spec ==0.4.0.0, 2651 | typography-geometry ==1.0.1.0, 2652 | typst ==0.6.1, 2653 | typst-symbols ==0.1.7, 2654 | tz ==0.1.3.6, 2655 | tzdata ==0.2.20240201.0, 2656 | tztime ==0.1.1.0, 2657 | ua-parser ==0.7.7.0, 2658 | uglymemo ==0.1.0.1, 2659 | ulid ==0.3.2.0, 2660 | unagi-chan ==0.4.1.4, 2661 | unbounded-delays ==0.1.1.1, 2662 | unbound-generics ==0.4.4, 2663 | unboxed-ref ==0.4.0.0, 2664 | unboxing-vector ==0.2.0.0, 2665 | uncaught-exception ==0.1.0, 2666 | uncertain ==0.4.0.1, 2667 | unconstrained ==0.1.0.2, 2668 | unexceptionalio ==0.5.1, 2669 | unexceptionalio-trans ==0.5.2, 2670 | unicode ==0.0.1.1, 2671 | unicode-collation ==0.1.3.6, 2672 | unicode-data ==0.6.0, 2673 | unicode-show ==0.1.1.1, 2674 | unicode-transforms ==0.4.0.1, 2675 | unidecode ==0.1.0.4, 2676 | unification-fd ==0.12.0.1, 2677 | union ==0.1.2, 2678 | union-angle ==0.1.0.1, 2679 | union-color ==0.1.2.1, 2680 | union-find-array ==0.1.0.4, 2681 | unipatterns ==0.0.0.0, 2682 | uniplate ==1.6.13, 2683 | uniq-deep ==1.2.1, 2684 | unique-logic ==0.4.0.1, 2685 | unique-logic-tf ==0.5.1, 2686 | unit-constraint ==0.0.0, 2687 | universe ==1.2.3, 2688 | universe-base ==1.1.4, 2689 | universe-dependent-sum ==1.3.1, 2690 | universe-instances-extended ==1.1.4, 2691 | universe-reverse-instances ==1.1.2, 2692 | universe-some ==1.2.2, 2693 | universum ==1.8.2.2, 2694 | unix installed, 2695 | unix-bytestring ==0.4.0.2, 2696 | unix-compat ==0.7.3, 2697 | unix-time ==0.4.16, 2698 | unjson ==0.15.4, 2699 | unlifted ==0.2.2.0, 2700 | unliftio ==0.2.25.0, 2701 | unliftio-core ==0.2.1.0, 2702 | unliftio-pool ==0.4.3.0, 2703 | unliftio-streams ==0.2.0.0, 2704 | unlit ==0.4.0.0, 2705 | unordered-containers ==0.2.20, 2706 | unsafe ==0.0, 2707 | uri-bytestring ==0.3.3.1, 2708 | uri-bytestring-aeson ==0.1.0.8, 2709 | uri-encode ==1.5.0.7, 2710 | url ==2.1.3, 2711 | users ==0.5.0.0, 2712 | users-test ==0.5.0.1, 2713 | utf8-light ==0.4.4.0, 2714 | utf8-string ==1.0.2, 2715 | utility-ht ==0.0.17.2, 2716 | uuid ==1.3.16, 2717 | uuid-types ==1.0.6, 2718 | valida ==1.1.0, 2719 | valida-base ==0.2.0, 2720 | validate-input ==0.5.0.0, 2721 | validation ==1.1.3, 2722 | validation-selective ==0.2.0.0, 2723 | validity ==0.12.1.0, 2724 | validity-aeson ==0.2.0.5, 2725 | validity-bytestring ==0.4.1.1, 2726 | validity-case-insensitive ==0.0.0.0, 2727 | validity-containers ==0.5.0.5, 2728 | validity-network-uri ==0.0.0.1, 2729 | validity-persistent ==0.0.0.0, 2730 | validity-primitive ==0.0.0.1, 2731 | validity-scientific ==0.2.0.3, 2732 | validity-text ==0.3.1.3, 2733 | validity-time ==0.5.0.0, 2734 | validity-unordered-containers ==0.2.0.3, 2735 | validity-uuid ==0.1.0.3, 2736 | validity-vector ==0.2.0.3, 2737 | valor ==1.0.0.0, 2738 | varying ==0.8.1.0, 2739 | vault ==0.3.1.5, 2740 | vcs-ignore ==0.0.2.0, 2741 | vec ==0.5.1, 2742 | vector ==0.13.2.0, 2743 | vector-algorithms ==0.9.0.3, 2744 | vector-binary-instances ==0.2.5.2, 2745 | vector-buffer ==0.4.1, 2746 | vector-builder ==0.3.8.5, 2747 | vector-bytes-instances ==0.1.1, 2748 | vector-extras ==0.2.8.2, 2749 | vector-hashtables ==0.1.2.0, 2750 | vector-instances ==3.4.2, 2751 | vector-mmap ==0.0.3, 2752 | vector-quicksort ==0.2, 2753 | vector-rotcev ==0.1.0.2, 2754 | vector-sized ==1.6.1, 2755 | vector-space ==0.19, 2756 | vector-split ==1.0.0.3, 2757 | vector-stream ==0.1.0.1, 2758 | vector-th-unbox ==0.2.2, 2759 | versions ==6.0.7, 2760 | vformat ==0.14.1.0, 2761 | vformat-time ==0.1.0.0, 2762 | ViennaRNAParser ==1.3.3, 2763 | vinyl ==0.14.3, 2764 | vinyl-loeb ==0.0.1.0, 2765 | Vis ==1.0.0, 2766 | vivid-osc ==0.5.0.0, 2767 | vivid-supercollider ==0.4.1.2, 2768 | void ==0.7.3, 2769 | vty ==6.2, 2770 | vty-crossplatform ==0.4.0.0, 2771 | vty-unix ==0.2.0.0, 2772 | vty-windows ==0.2.0.3, 2773 | wai ==3.2.4, 2774 | wai-app-static ==3.1.9, 2775 | wai-cli ==0.2.3, 2776 | wai-conduit ==3.0.0.4, 2777 | wai-cors ==0.2.7, 2778 | wai-enforce-https ==1.0.0.0, 2779 | wai-eventsource ==3.0.0, 2780 | wai-extra ==3.1.16, 2781 | wai-feature-flags ==0.1.0.8, 2782 | wai-handler-launch ==3.0.3.1, 2783 | wai-logger ==2.5.0, 2784 | wai-middleware-bearer ==1.0.3, 2785 | wai-middleware-caching ==0.1.0.2, 2786 | wai-middleware-caching-lru ==0.1.0.0, 2787 | wai-middleware-caching-redis ==0.2.0.0, 2788 | wai-middleware-clacks ==0.1.0.1, 2789 | wai-middleware-delegate ==0.2.0.0, 2790 | wai-middleware-metrics ==0.2.4, 2791 | wai-middleware-prometheus ==1.0.1.0, 2792 | wai-middleware-static ==0.9.3, 2793 | wai-middleware-throttle ==0.3.0.1, 2794 | wai-rate-limit ==0.3.0.0, 2795 | wai-rate-limit-redis ==0.2.0.1, 2796 | wai-saml2 ==0.6, 2797 | wai-session ==0.3.3, 2798 | wai-session-postgresql ==0.2.1.3, 2799 | wai-slack-middleware ==0.2.0, 2800 | wai-transformers ==0.1.0, 2801 | wai-websockets ==3.0.1.2, 2802 | wakame ==0.1.0.0, 2803 | warp ==3.4.7, 2804 | warp-tls ==3.4.12, 2805 | wave ==0.2.1, 2806 | wcwidth ==0.0.2, 2807 | webdriver ==0.12.0.1, 2808 | webdriver-wrapper ==0.2.0.1, 2809 | webex-teams-api ==0.2.0.1, 2810 | webex-teams-conduit ==0.2.0.1, 2811 | webgear-core ==1.3.1, 2812 | webgear-server ==1.3.1, 2813 | webgear-swagger-ui ==1.3.1, 2814 | webpage ==0.0.5.1, 2815 | web-rep ==0.13.0.0, 2816 | web-routes ==0.27.16, 2817 | web-routes-th ==0.22.8.2, 2818 | webrtc-vad ==0.1.0.3, 2819 | websockets ==0.13.0.0, 2820 | websockets-simple ==0.2.0, 2821 | websockets-snap ==0.10.3.1, 2822 | weigh ==0.0.18, 2823 | welford-online-mean-variance ==0.2.0.0, 2824 | what4 ==1.6.2, 2825 | wherefrom-compat ==0.1.1.1, 2826 | wide-word ==0.1.6.0, 2827 | wild-bind ==0.1.2.10, 2828 | Win32 installed, 2829 | Win32-notify ==0.3.0.3, 2830 | windns ==0.1.0.1, 2831 | witch ==1.2.3.1, 2832 | withdependencies ==0.3.1, 2833 | witherable ==0.5, 2834 | with-utf8 ==1.1.0.0, 2835 | witness ==0.7, 2836 | wizards ==1.0.3, 2837 | wkt-types ==0.1.0.0, 2838 | wl-pprint ==1.2.1, 2839 | wl-pprint-annotated ==0.1.0.1, 2840 | wl-pprint-text ==1.2.0.2, 2841 | word8 ==0.1.3, 2842 | word-compat ==0.0.6, 2843 | word-trie ==0.3.0, 2844 | word-wrap ==0.5, 2845 | world-peace ==1.0.2.0, 2846 | wrap ==0.0.0, 2847 | wraxml ==0.5, 2848 | wreq ==0.5.4.3, 2849 | wreq-stringless ==0.5.9.1, 2850 | writer-cps-transformers ==0.5.6.1, 2851 | ws ==0.0.6, 2852 | wuss ==2.0.2.2, 2853 | Xauth ==0.1, 2854 | xdg-basedir ==0.2.2, 2855 | xdg-desktop-entry ==0.1.1.2, 2856 | xdg-userdirs ==0.1.0.2, 2857 | xeno ==0.6, 2858 | xhtml installed, 2859 | xml ==1.3.14, 2860 | xml-basic ==0.1.3.2, 2861 | xmlbf ==0.7, 2862 | xmlbf-xeno ==0.2.2, 2863 | xmlbf-xmlhtml ==0.2.2, 2864 | xml-conduit ==1.9.1.4, 2865 | xml-conduit-writer ==0.1.1.5, 2866 | xmlgen ==0.6.2.2, 2867 | xml-hamlet ==0.5.0.2, 2868 | xml-helpers ==1.0.0, 2869 | xmlhtml ==0.2.5.4, 2870 | xml-html-qq ==0.1.0.1, 2871 | xml-indexed-cursor ==0.1.1.0, 2872 | xml-picklers ==0.3.6, 2873 | xml-to-json-fast ==2.0.0, 2874 | xml-types ==0.3.8, 2875 | xor ==0.0.1.3, 2876 | xss-sanitize ==0.3.7.2, 2877 | xxhash-ffi ==0.3, 2878 | yaml ==0.11.11.2, 2879 | yaml-unscrambler ==0.1.0.19, 2880 | Yampa ==0.14.12, 2881 | yarn-lock ==0.6.5, 2882 | yeshql-core ==4.2.0.0, 2883 | yesod ==1.6.2.1, 2884 | yesod-auth ==1.6.11.3, 2885 | yesod-auth-basic ==0.1.0.3, 2886 | yesod-auth-hashdb ==1.7.1.7, 2887 | yesod-auth-oauth2 ==0.7.4.0, 2888 | yesod-bin ==1.6.2.3, 2889 | yesod-core ==1.6.26.0, 2890 | yesod-eventsource ==1.6.0.1, 2891 | yesod-form ==1.7.9, 2892 | yesod-form-bootstrap4 ==3.0.1.1, 2893 | yesod-gitrepo ==0.3.0, 2894 | yesod-gitrev ==0.2.2, 2895 | yesod-markdown ==0.12.6.14, 2896 | yesod-newsfeed ==1.7.0.0, 2897 | yesod-page-cursor ==2.0.1.0, 2898 | yesod-paginator ==1.1.2.2, 2899 | yesod-persistent ==1.6.0.8, 2900 | yesod-recaptcha2 ==1.0.2.1, 2901 | yesod-routes-flow ==3.0.0.2, 2902 | yesod-sitemap ==1.6.0, 2903 | yesod-static ==1.6.1.0, 2904 | yesod-test ==1.6.19, 2905 | yesod-websockets ==0.3.0.3, 2906 | yes-precure5-command ==5.5.3, 2907 | yggdrasil-schema ==1.0.0.6, 2908 | yi ==0.19.3, 2909 | yi-core ==0.19.4, 2910 | yi-frontend-pango ==0.19.2, 2911 | yi-frontend-vty ==0.19.1, 2912 | yi-keymap-cua ==0.19.0, 2913 | yi-keymap-emacs ==0.19.0, 2914 | yi-keymap-vim ==0.19.0, 2915 | yi-language ==0.19.2, 2916 | yi-misc-modes ==0.19.1, 2917 | yi-mode-haskell ==0.19.1, 2918 | yi-mode-javascript ==0.19.1, 2919 | yi-rope ==0.11, 2920 | yjsvg ==0.2.0.1, 2921 | yjtools ==0.9.18, 2922 | yoga ==0.0.0.8, 2923 | youtube ==0.2.1.1, 2924 | zenc ==0.1.2, 2925 | zeromq4-haskell ==0.8.0, 2926 | zeromq4-patterns ==0.3.1.0, 2927 | zigzag ==0.1.0.0, 2928 | zim-parser ==0.2.1.0, 2929 | zip-archive ==0.4.3.2, 2930 | zippers ==0.3.2, 2931 | zip-stream ==0.2.2.0, 2932 | zlib ==0.7.1.0, 2933 | zlib-bindings ==0.1.1.5, 2934 | zlib-clib ==1.3.1, 2935 | zot ==0.0.3, 2936 | zstd ==0.1.3.0 2937 | -------------------------------------------------------------------------------- /equational-reasoning.cabal: -------------------------------------------------------------------------------- 1 | cabal-version: 3.4 2 | name: equational-reasoning 3 | version: 0.7.1.0 4 | synopsis: Proof assistant for Haskell using DataKinds & PolyKinds 5 | description: 6 | A simple convenient library to write equational / preorder proof as in Agda. 7 | Since 0.6.0.0, this no longer depends on @singletons@ package, and the @Proof.Induction@ module goes to @equational-reasoning-induction@ package. 8 | 9 | license: BSD-3-Clause 10 | license-file: LICENSE 11 | author: Hiromi ISHII 12 | maintainer: konn.jinro_at_gmail.com 13 | copyright: (c) Hiromi ISHII 2013-2020 14 | category: Math 15 | build-type: Simple 16 | tested-with: 17 | ghc ==9.2.8 || ==9.4.8 || ==9.6.5 || ==9.8.4 || ==9.10.1 || ==9.12.2 18 | 19 | extra-doc-files: 20 | Changelog.md 21 | README.md 22 | 23 | source-repository head 24 | type: git 25 | location: git://github.com/konn/equational-reasoning-in-haskell.git 26 | 27 | library 28 | -- cabal-gild: discover ./Proof/**/*.hs --exclude Proof/Propositional/TH.hs 29 | exposed-modules: 30 | Proof.Equational 31 | Proof.Propositional 32 | Proof.Propositional.Empty 33 | Proof.Propositional.Inhabited 34 | 35 | other-modules: Proof.Propositional.TH 36 | ghc-options: -Wall 37 | build-depends: 38 | base >=4.13 && <5, 39 | containers >=0.5 && <0.8, 40 | template-haskell >=2.11 && <2.24, 41 | th-desugar >=1.13 && <1.19, 42 | void >=0.6 && <0.8, 43 | 44 | default-language: Haskell2010 45 | -------------------------------------------------------------------------------- /examples/sandbox.hs: -------------------------------------------------------------------------------- 1 | {-# LANGUAGE DataKinds, GADTs, InstanceSigs, KindSignatures, RankNTypes #-} 2 | {-# LANGUAGE ScopedTypeVariables, StandaloneDeriving, TemplateHaskell #-} 3 | {-# LANGUAGE TypeFamilies, TypeOperators, UndecidableInstances #-} 4 | module Main where 5 | import Data.Singletons 6 | import Data.Singletons.Prelude.Num ((%:-)) 7 | import Data.Singletons.TH 8 | import Data.Type.Equality 9 | import GHC.TypeLits 10 | import Prelude hiding ((+)) 11 | import Proof.Equational 12 | import Unsafe.Coerce (unsafeCoerce) 13 | 14 | singletons [d| 15 | data Peano = Z | S Peano 16 | |] 17 | 18 | slowRefl :: SPeano n -> n :~: n 19 | slowRefl SZ = Refl 20 | slowRefl (SS n) = 21 | case slowRefl n of 22 | Refl -> Refl 23 | 24 | type family FromInteger a where 25 | FromInteger 0 = 'Z 26 | FromInteger n = 'S (FromInteger (n - 1)) 27 | 28 | type family ToInteger a where 29 | ToInteger 'Z = 0 30 | ToInteger ('S n) = 1 + ToInteger n 31 | 32 | sFromInteger :: Sing n -> SPeano (FromInteger n) 33 | sFromInteger n = 34 | case (sing :: Sing 0) %~ n of 35 | Proved Refl -> SZ 36 | Disproved _ -> unsafeCoerce (SS (sFromInteger (n %:- (sing :: Sing 1)))) 37 | 38 | 39 | succFromCommute :: Sing n -> ToInteger n + 1 :~: ToInteger ('S n) 40 | succFromCommute _ = loop 1223456789 41 | where 42 | loop 0 = unsafeCoerce (Refl :: () :~: ()) 43 | loop n = loop (n - 1) 44 | 45 | trivial :: (ToInteger ('S (FromInteger 45)) ~ (ToInteger (FromInteger 45) + 1)) => () 46 | trivial = () 47 | 48 | main :: IO () 49 | main = act 50 | 51 | act :: IO () 52 | act = 53 | let sn = sing :: Sing (FromInteger 45) 54 | in print $ withRefl (succFromCommute sn) trivial 55 | 56 | -------------------------------------------------------------------------------- /fourmolu.yaml: -------------------------------------------------------------------------------- 1 | indentation: 2 2 | comma-style: leading 3 | record-brace-space: true 4 | indent-wheres: true 5 | diff-friendly-import-export: false 6 | respectful: false 7 | haddock-style: multi-line 8 | newlines-between-decls: 1 9 | --------------------------------------------------------------------------------