Skip to content

Commit 3e80229

Browse files
authored
Merge pull request #467 from Qqwy/more_num_instances
Adds missing Data.Num.Linear.* instances for Word, Integer, Natural, Float, Word8/16/32/64 Int8/16/32/64
2 parents 074aeb8 + c0438dd commit 3e80229

File tree

3 files changed

+162
-24
lines changed

3 files changed

+162
-24
lines changed

linear-base.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ library
135135
base >=4.16 && <5,
136136
containers,
137137
ghc-prim,
138+
ghc-bignum,
138139
hashable,
139140
linear-generics >= 0.2,
140141
storable-tuple,

src/Data/Num/Linear.hs

Lines changed: 132 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,11 @@ where
4242

4343
-- TODO: flesh out laws
4444

45+
import qualified Data.Int
4546
import Data.Monoid.Linear
4647
import Data.Unrestricted.Linear
48+
import qualified Data.Word
49+
import GHC.Num.Natural (Natural)
4750
import qualified Unsafe.Linear as Unsafe
4851
import qualified Prelude
4952

@@ -208,38 +211,143 @@ instance (MultIdentity a) => Monoid (Product a) where
208211
instance (AddIdentity a) => Monoid (Sum a) where
209212
mempty = Sum zero
210213

214+
{- ORMOLU_DISABLE -}
211215
deriving via MovableNum Prelude.Int instance Additive Prelude.Int
212-
213-
deriving via MovableNum Prelude.Double instance Additive Prelude.Double
214-
215216
deriving via MovableNum Prelude.Int instance AddIdentity Prelude.Int
216-
217-
deriving via MovableNum Prelude.Double instance AddIdentity Prelude.Double
218-
219217
deriving via MovableNum Prelude.Int instance AdditiveGroup Prelude.Int
220-
221-
deriving via MovableNum Prelude.Double instance AdditiveGroup Prelude.Double
222-
223218
deriving via MovableNum Prelude.Int instance Multiplicative Prelude.Int
224-
225-
deriving via MovableNum Prelude.Double instance Multiplicative Prelude.Double
226-
227219
deriving via MovableNum Prelude.Int instance MultIdentity Prelude.Int
228-
229-
deriving via MovableNum Prelude.Double instance MultIdentity Prelude.Double
230-
231220
deriving via MovableNum Prelude.Int instance Semiring Prelude.Int
232-
233-
deriving via MovableNum Prelude.Double instance Semiring Prelude.Double
234-
235221
deriving via MovableNum Prelude.Int instance Ring Prelude.Int
236-
237-
deriving via MovableNum Prelude.Double instance Ring Prelude.Double
238-
239222
deriving via MovableNum Prelude.Int instance FromInteger Prelude.Int
240-
241-
deriving via MovableNum Prelude.Double instance FromInteger Prelude.Double
242-
243223
deriving via MovableNum Prelude.Int instance Num Prelude.Int
244224

225+
deriving via MovableNum Prelude.Word instance Additive Prelude.Word
226+
deriving via MovableNum Prelude.Word instance AddIdentity Prelude.Word
227+
deriving via MovableNum Prelude.Word instance AdditiveGroup Prelude.Word
228+
deriving via MovableNum Prelude.Word instance Multiplicative Prelude.Word
229+
deriving via MovableNum Prelude.Word instance MultIdentity Prelude.Word
230+
deriving via MovableNum Prelude.Word instance Semiring Prelude.Word
231+
deriving via MovableNum Prelude.Word instance Ring Prelude.Word
232+
deriving via MovableNum Prelude.Word instance FromInteger Prelude.Word
233+
deriving via MovableNum Prelude.Word instance Num Prelude.Word
234+
235+
deriving via MovableNum Prelude.Double instance Additive Prelude.Double
236+
deriving via MovableNum Prelude.Double instance AddIdentity Prelude.Double
237+
deriving via MovableNum Prelude.Double instance AdditiveGroup Prelude.Double
238+
deriving via MovableNum Prelude.Double instance Multiplicative Prelude.Double
239+
deriving via MovableNum Prelude.Double instance MultIdentity Prelude.Double
240+
deriving via MovableNum Prelude.Double instance Semiring Prelude.Double
241+
deriving via MovableNum Prelude.Double instance Ring Prelude.Double
242+
deriving via MovableNum Prelude.Double instance FromInteger Prelude.Double
245243
deriving via MovableNum Prelude.Double instance Num Prelude.Double
244+
245+
deriving via MovableNum Prelude.Float instance Additive Prelude.Float
246+
deriving via MovableNum Prelude.Float instance AddIdentity Prelude.Float
247+
deriving via MovableNum Prelude.Float instance AdditiveGroup Prelude.Float
248+
deriving via MovableNum Prelude.Float instance Multiplicative Prelude.Float
249+
deriving via MovableNum Prelude.Float instance MultIdentity Prelude.Float
250+
deriving via MovableNum Prelude.Float instance Semiring Prelude.Float
251+
deriving via MovableNum Prelude.Float instance Ring Prelude.Float
252+
deriving via MovableNum Prelude.Float instance FromInteger Prelude.Float
253+
deriving via MovableNum Prelude.Float instance Num Prelude.Float
254+
255+
deriving via MovableNum Prelude.Integer instance Additive Prelude.Integer
256+
deriving via MovableNum Prelude.Integer instance AddIdentity Prelude.Integer
257+
deriving via MovableNum Prelude.Integer instance AdditiveGroup Prelude.Integer
258+
deriving via MovableNum Prelude.Integer instance Multiplicative Prelude.Integer
259+
deriving via MovableNum Prelude.Integer instance MultIdentity Prelude.Integer
260+
deriving via MovableNum Prelude.Integer instance Semiring Prelude.Integer
261+
deriving via MovableNum Prelude.Integer instance Ring Prelude.Integer
262+
deriving via MovableNum Prelude.Integer instance FromInteger Prelude.Integer
263+
deriving via MovableNum Prelude.Integer instance Num Prelude.Integer
264+
265+
deriving via MovableNum Natural instance Additive Natural
266+
deriving via MovableNum Natural instance AddIdentity Natural
267+
deriving via MovableNum Natural instance AdditiveGroup Natural
268+
deriving via MovableNum Natural instance Multiplicative Natural
269+
deriving via MovableNum Natural instance MultIdentity Natural
270+
deriving via MovableNum Natural instance Semiring Natural
271+
-- NOTE: Natural is not a Ring; no element but 0 has an additive inverse.
272+
deriving via MovableNum Natural instance FromInteger Natural
273+
274+
deriving via MovableNum Data.Int.Int8 instance Additive Data.Int.Int8
275+
deriving via MovableNum Data.Int.Int8 instance AddIdentity Data.Int.Int8
276+
deriving via MovableNum Data.Int.Int8 instance AdditiveGroup Data.Int.Int8
277+
deriving via MovableNum Data.Int.Int8 instance Multiplicative Data.Int.Int8
278+
deriving via MovableNum Data.Int.Int8 instance MultIdentity Data.Int.Int8
279+
deriving via MovableNum Data.Int.Int8 instance Semiring Data.Int.Int8
280+
deriving via MovableNum Data.Int.Int8 instance Ring Data.Int.Int8
281+
deriving via MovableNum Data.Int.Int8 instance FromInteger Data.Int.Int8
282+
deriving via MovableNum Data.Int.Int8 instance Num Data.Int.Int8
283+
284+
deriving via MovableNum Data.Int.Int16 instance Additive Data.Int.Int16
285+
deriving via MovableNum Data.Int.Int16 instance AddIdentity Data.Int.Int16
286+
deriving via MovableNum Data.Int.Int16 instance AdditiveGroup Data.Int.Int16
287+
deriving via MovableNum Data.Int.Int16 instance Multiplicative Data.Int.Int16
288+
deriving via MovableNum Data.Int.Int16 instance MultIdentity Data.Int.Int16
289+
deriving via MovableNum Data.Int.Int16 instance Semiring Data.Int.Int16
290+
deriving via MovableNum Data.Int.Int16 instance Ring Data.Int.Int16
291+
deriving via MovableNum Data.Int.Int16 instance FromInteger Data.Int.Int16
292+
deriving via MovableNum Data.Int.Int16 instance Num Data.Int.Int16
293+
294+
deriving via MovableNum Data.Int.Int32 instance Additive Data.Int.Int32
295+
deriving via MovableNum Data.Int.Int32 instance AddIdentity Data.Int.Int32
296+
deriving via MovableNum Data.Int.Int32 instance AdditiveGroup Data.Int.Int32
297+
deriving via MovableNum Data.Int.Int32 instance Multiplicative Data.Int.Int32
298+
deriving via MovableNum Data.Int.Int32 instance MultIdentity Data.Int.Int32
299+
deriving via MovableNum Data.Int.Int32 instance Semiring Data.Int.Int32
300+
deriving via MovableNum Data.Int.Int32 instance Ring Data.Int.Int32
301+
deriving via MovableNum Data.Int.Int32 instance FromInteger Data.Int.Int32
302+
deriving via MovableNum Data.Int.Int32 instance Num Data.Int.Int32
303+
304+
deriving via MovableNum Data.Int.Int64 instance Additive Data.Int.Int64
305+
deriving via MovableNum Data.Int.Int64 instance AddIdentity Data.Int.Int64
306+
deriving via MovableNum Data.Int.Int64 instance AdditiveGroup Data.Int.Int64
307+
deriving via MovableNum Data.Int.Int64 instance Multiplicative Data.Int.Int64
308+
deriving via MovableNum Data.Int.Int64 instance MultIdentity Data.Int.Int64
309+
deriving via MovableNum Data.Int.Int64 instance Semiring Data.Int.Int64
310+
deriving via MovableNum Data.Int.Int64 instance Ring Data.Int.Int64
311+
deriving via MovableNum Data.Int.Int64 instance FromInteger Data.Int.Int64
312+
deriving via MovableNum Data.Int.Int64 instance Num Data.Int.Int64
313+
314+
deriving via MovableNum Data.Word.Word8 instance Additive Data.Word.Word8
315+
deriving via MovableNum Data.Word.Word8 instance AddIdentity Data.Word.Word8
316+
deriving via MovableNum Data.Word.Word8 instance AdditiveGroup Data.Word.Word8
317+
deriving via MovableNum Data.Word.Word8 instance Multiplicative Data.Word.Word8
318+
deriving via MovableNum Data.Word.Word8 instance MultIdentity Data.Word.Word8
319+
deriving via MovableNum Data.Word.Word8 instance Semiring Data.Word.Word8
320+
deriving via MovableNum Data.Word.Word8 instance Ring Data.Word.Word8
321+
deriving via MovableNum Data.Word.Word8 instance FromInteger Data.Word.Word8
322+
deriving via MovableNum Data.Word.Word8 instance Num Data.Word.Word8
323+
324+
deriving via MovableNum Data.Word.Word16 instance Additive Data.Word.Word16
325+
deriving via MovableNum Data.Word.Word16 instance AddIdentity Data.Word.Word16
326+
deriving via MovableNum Data.Word.Word16 instance AdditiveGroup Data.Word.Word16
327+
deriving via MovableNum Data.Word.Word16 instance Multiplicative Data.Word.Word16
328+
deriving via MovableNum Data.Word.Word16 instance MultIdentity Data.Word.Word16
329+
deriving via MovableNum Data.Word.Word16 instance Semiring Data.Word.Word16
330+
deriving via MovableNum Data.Word.Word16 instance Ring Data.Word.Word16
331+
deriving via MovableNum Data.Word.Word16 instance FromInteger Data.Word.Word16
332+
deriving via MovableNum Data.Word.Word16 instance Num Data.Word.Word16
333+
334+
deriving via MovableNum Data.Word.Word32 instance Additive Data.Word.Word32
335+
deriving via MovableNum Data.Word.Word32 instance AddIdentity Data.Word.Word32
336+
deriving via MovableNum Data.Word.Word32 instance AdditiveGroup Data.Word.Word32
337+
deriving via MovableNum Data.Word.Word32 instance Multiplicative Data.Word.Word32
338+
deriving via MovableNum Data.Word.Word32 instance MultIdentity Data.Word.Word32
339+
deriving via MovableNum Data.Word.Word32 instance Semiring Data.Word.Word32
340+
deriving via MovableNum Data.Word.Word32 instance Ring Data.Word.Word32
341+
deriving via MovableNum Data.Word.Word32 instance FromInteger Data.Word.Word32
342+
deriving via MovableNum Data.Word.Word32 instance Num Data.Word.Word32
343+
344+
deriving via MovableNum Data.Word.Word64 instance Additive Data.Word.Word64
345+
deriving via MovableNum Data.Word.Word64 instance AddIdentity Data.Word.Word64
346+
deriving via MovableNum Data.Word.Word64 instance AdditiveGroup Data.Word.Word64
347+
deriving via MovableNum Data.Word.Word64 instance Multiplicative Data.Word.Word64
348+
deriving via MovableNum Data.Word.Word64 instance MultIdentity Data.Word.Word64
349+
deriving via MovableNum Data.Word.Word64 instance Semiring Data.Word.Word64
350+
deriving via MovableNum Data.Word.Word64 instance Ring Data.Word.Word64
351+
deriving via MovableNum Data.Word.Word64 instance FromInteger Data.Word.Word64
352+
deriving via MovableNum Data.Word.Word64 instance Num Data.Word.Word64
353+
{- ORMOLU_ENABLE -}

src/Data/Unrestricted/Linear/Internal/Instances.hs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ import Data.V.Linear.Internal (V (..))
3333
import qualified Data.V.Linear.Internal as V
3434
import qualified Data.Vector as Vector
3535
import GHC.Int
36+
import GHC.Num.Integer (Integer (..))
37+
import GHC.Num.Natural (Natural (..))
3638
import GHC.TypeLits
3739
import GHC.Word
3840
import Prelude.Linear.Internal
@@ -146,6 +148,33 @@ instance Movable Word64 where
146148
-- copying an 'Word64#' and using it several times. /!\
147149
move (W64# i) = Unsafe.toLinear (\j -> Ur (W64# j)) i
148150

151+
deriving via (AsMovable Integer) instance Consumable Integer
152+
153+
deriving via (AsMovable Integer) instance Dupable Integer
154+
155+
instance Movable Integer where
156+
-- /!\ 'Integer' is a sum type whose three possibilities each are strict wrappers of unboxed unlifed data types.
157+
-- (source: https://hackage.haskell.org/package/ghc-bignum-1.2/docs/GHC-Num-Integer.html#t:Integer)
158+
-- Therefore it cannot have any linear values hidden in a closure anywhere. Therefore it is safe to call
159+
-- non-linear functions linearly on this type: there is no difference between
160+
-- copying an 'Integer' and using it several times. /!\
161+
move (IS i) = Unsafe.toLinear (\j -> Ur (IS j)) i
162+
move (IP i) = Unsafe.toLinear (\j -> Ur (IP j)) i
163+
move (IN i) = Unsafe.toLinear (\j -> Ur (IN j)) i
164+
165+
deriving via (AsMovable Natural) instance Consumable Natural
166+
167+
deriving via (AsMovable Natural) instance Dupable Natural
168+
169+
instance Movable Natural where
170+
-- /!\ 'Natural' is a sum type whose two possibilities each are strict wrappers of unboxed unlifed data types.
171+
-- (source: https://hackage.haskell.org/package/ghc-bignum-1.2/docs/GHC-Num-Natural.html#t:Natural)
172+
-- Therefore it cannot have any linear values hidden in a closure anywhere. Therefore it is safe to call
173+
-- non-linear functions linearly on this type: there is no difference between
174+
-- copying an 'Integer' and using it several times. /!\
175+
move (NS i) = Unsafe.toLinear (\j -> Ur (NS j)) i
176+
move (NB i) = Unsafe.toLinear (\j -> Ur (NB j)) i
177+
149178
-- TODO: instances for longer primitive tuples
150179
-- TODO: default instances based on the Generic framework
151180

0 commit comments

Comments
 (0)