mirror of
https://github.com/tensorflow/haskell.git
synced 2024-12-25 02:59:46 +01:00
Update type constraints to work around a ghc-8 bug. (#47)
Also removes all the ghc-8-specific logic in the .cabal files. ghc-8 has issues with deeply nested tuples of constraints. We can work around it by: - Changing TensorTypes to a regular class. This required FlexibleContexts. (But we'll probably need it anyway when we support heterogeneous tensor lists.) - Specializing NoneOf for long type lists. For more details, see: https://ghc.haskell.org/trac/ghc/ticket/12175. Also added 'directory' to tensorflow-core-ops' dependencies since it's used in the Setup script. One more step towards fixing #38.
This commit is contained in:
parent
71bdc6f744
commit
1539783ee5
9 changed files with 19 additions and 22 deletions
|
@ -15,6 +15,7 @@ library
|
|||
exposed-modules: TensorFlow.GenOps.Core
|
||||
build-depends: Cabal >= 1.22 && < 1.25
|
||||
, bytestring
|
||||
, directory
|
||||
, proto-lens == 0.1.*
|
||||
, tensorflow-opgen == 0.1.*
|
||||
, tensorflow == 0.1.*
|
||||
|
@ -24,10 +25,6 @@ library
|
|||
, lens-family
|
||||
, text
|
||||
default-language: Haskell2010
|
||||
-- Work around https://ghc.haskell.org/trac/ghc/ticket/12175.
|
||||
if impl(ghc >= 8) {
|
||||
ghc-options: -fconstraint-solver-iterations=0
|
||||
}
|
||||
|
||||
source-repository head
|
||||
type: git
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
-- limitations under the License.
|
||||
|
||||
{-# LANGUAGE DataKinds #-}
|
||||
{-# LANGUAGE FlexibleContexts #-}
|
||||
{-# LANGUAGE OverloadedStrings #-}
|
||||
|
||||
module TensorFlow.NN
|
||||
|
|
|
@ -19,10 +19,6 @@ library
|
|||
, tensorflow == 0.1.*
|
||||
, tensorflow-ops == 0.1.*
|
||||
default-language: Haskell2010
|
||||
-- Work around https://ghc.haskell.org/trac/ghc/ticket/12175.
|
||||
if impl(ghc >= 8) {
|
||||
ghc-options: -fconstraint-solver-iterations=0
|
||||
}
|
||||
|
||||
|
||||
Test-Suite NNTest
|
||||
|
|
|
@ -117,6 +117,7 @@ docOpList :: OpGenFlags -> OpList -> Doc
|
|||
docOpList flags opList =
|
||||
stack [ "{-# LANGUAGE ConstraintKinds #-}"
|
||||
, "{-# LANGUAGE DataKinds #-}"
|
||||
, "{-# LANGUAGE FlexibleContexts #-}"
|
||||
, "{-# LANGUAGE FlexibleInstances #-}"
|
||||
, "{-# LANGUAGE OverloadedStrings #-}"
|
||||
, "{-# LANGUAGE ScopedTypeVariables #-}"
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
|
||||
{-# LANGUAGE ConstraintKinds #-}
|
||||
{-# LANGUAGE DataKinds #-}
|
||||
{-# LANGUAGE FlexibleContexts #-}
|
||||
{-# LANGUAGE NoMonomorphismRestriction #-}
|
||||
{-# LANGUAGE OverloadedStrings #-}
|
||||
{-# LANGUAGE RankNTypes #-}
|
||||
|
|
|
@ -46,6 +46,7 @@
|
|||
-- TensorFlow uses to avoid common subexpression elimination.)
|
||||
{-# LANGUAGE ConstraintKinds #-}
|
||||
{-# LANGUAGE DataKinds #-}
|
||||
{-# LANGUAGE FlexibleContexts #-}
|
||||
{-# LANGUAGE FlexibleInstances #-}
|
||||
{-# LANGUAGE OverloadedLists #-}
|
||||
{-# LANGUAGE OverloadedStrings #-}
|
||||
|
|
|
@ -29,10 +29,6 @@ library
|
|||
, tensorflow-core-ops == 0.1.*
|
||||
, text
|
||||
default-language: Haskell2010
|
||||
-- Work around https://ghc.haskell.org/trac/ghc/ticket/12175.
|
||||
if impl(ghc >= 8) {
|
||||
ghc-options: -fconstraint-solver-iterations=0
|
||||
}
|
||||
|
||||
Test-Suite BuildTest
|
||||
default-language: Haskell2010
|
||||
|
@ -206,11 +202,6 @@ Test-Suite TypesTest
|
|||
, test-framework-hunit
|
||||
, test-framework-quickcheck2
|
||||
, vector
|
||||
-- Work around https://ghc.haskell.org/trac/ghc/ticket/12175,
|
||||
-- since this test defines its own ops.
|
||||
if impl(ghc >= 8) {
|
||||
ghc-options: -fconstraint-solver-iterations=0
|
||||
}
|
||||
|
||||
Benchmark FeedFetchBench
|
||||
default-language: Haskell2010
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
|
||||
{-# LANGUAGE ConstraintKinds #-}
|
||||
{-# LANGUAGE DataKinds #-}
|
||||
{-# LANGUAGE FlexibleContexts #-}
|
||||
{-# LANGUAGE NoMonomorphismRestriction #-}
|
||||
{-# LANGUAGE OverloadedLists #-}
|
||||
{-# LANGUAGE OverloadedStrings #-}
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
{-# LANGUAGE DataKinds #-}
|
||||
{-# LANGUAGE FlexibleContexts #-}
|
||||
{-# LANGUAGE FlexibleInstances #-}
|
||||
{-# LANGUAGE MultiParamTypeClasses #-}
|
||||
{-# LANGUAGE OverloadedStrings #-}
|
||||
{-# LANGUAGE RankNTypes #-}
|
||||
{-# LANGUAGE ScopedTypeVariables #-}
|
||||
|
@ -330,11 +331,11 @@ instance Attribute [Int64] where
|
|||
type OneOf ts a
|
||||
= (TensorType a, TensorTypes ts, NoneOf (AllTensorTypes \\ ts) a)
|
||||
|
||||
-- | A 'Constraint' checking that the input is a list of 'TensorType's.
|
||||
-- | A check that the input is a list of 'TensorType's.
|
||||
-- Helps improve error messages when using 'OneOf'.
|
||||
type family TensorTypes ts :: Constraint where
|
||||
TensorTypes '[] = ()
|
||||
TensorTypes (t ': ts) = (TensorType t, TensorTypes ts)
|
||||
class TensorTypes (ts :: [*]) where
|
||||
instance TensorTypes '[]
|
||||
instance (TensorType t, TensorTypes ts) => TensorTypes (t ': ts)
|
||||
|
||||
-- | A constraint checking that two types are different.
|
||||
type family a /= b :: Constraint where
|
||||
|
@ -378,5 +379,12 @@ type family as \\ bs where
|
|||
-- | A constraint that the type @a@ doesn't appear in the type list @ts@.
|
||||
-- Assumes that @a@ and each of the elements of @ts@ are 'TensorType's.
|
||||
type family NoneOf ts a :: Constraint where
|
||||
-- Specialize this type family when `ts` is a long list, to avoid deeply
|
||||
-- nested tuples of constraints. Works around a bug in ghc-8:
|
||||
-- https://ghc.haskell.org/trac/ghc/ticket/12175
|
||||
NoneOf (t1 ': t2 ': t3 ': t4 ': ts) a
|
||||
= (a /= t1, a /= t2, a /= t3, a /= t4, NoneOf ts a)
|
||||
NoneOf (t1 ': t2 ': t3 ': ts) a = (a /= t1, a /= t2, a /= t3, NoneOf ts a)
|
||||
NoneOf (t1 ': t2 ': ts) a = (a /= t1, a /= t2, NoneOf ts a)
|
||||
NoneOf (t1 ': ts) a = (a /= t1, NoneOf ts a)
|
||||
NoneOf '[] a = ()
|
||||
NoneOf (t ': ts) a = (a /= t, NoneOf ts a)
|
||||
|
|
Loading…
Reference in a new issue