Movatterモバイル変換
[0]ホーム
{-# LANGUAGE Trustworthy #-}{-# LANGUAGE NoImplicitPrelude #-}{-# LANGUAGE GADTs #-}{-# LANGUAGE ExplicitForAll #-}{-# LANGUAGE PatternSynonyms #-}{-# LANGUAGE ScopedTypeVariables #-}{-# LANGUAGE TypeApplications #-}------------------------------------------------------------------------------- |-- Module : Data.Dynamic-- Copyright : (c) The University of Glasgow 2001-- License : BSD-style (see the file libraries/base/LICENSE)---- Maintainer : libraries@haskell.org-- Stability : experimental-- Portability : portable---- The Dynamic interface provides basic support for dynamic types.---- Operations for injecting values of arbitrary type into-- a dynamically typed value, Dynamic, are provided, together-- with operations for converting dynamic values into a concrete-- (monomorphic) type.-------------------------------------------------------------------------------moduleData.Dynamic(-- * The @Dynamic@ typeDynamic(..),-- * Converting to and from @Dynamic@toDyn,fromDyn,fromDynamic,-- * Applying functions of dynamic typedynApply,dynApp,dynTypeRep,-- * Convenience re-exportsTypeable)whereimportData.Type.EqualityimportType.ReflectionimportData.MaybeimportGHC.BaseimportGHC.ShowimportGHC.Exception----------------------------------------------------------------- The type Dynamic---------------------------------------------------------------{-| A value of type 'Dynamic' is an object encapsulated together with its type. A 'Dynamic' may only represent a monomorphic value; an attempt to create a value of type 'Dynamic' from a polymorphically-typed expression will result in an ambiguity error (see 'toDyn'). 'Show'ing a value of type 'Dynamic' returns a pretty-printed representation of the object\'s type; useful for debugging.-}dataDynamicwhereDynamic::foralla.TypeRepa->a->Dynamic-- | @since 2.01instanceShowDynamicwhere-- the instance just prints the type representation.showsPrec_(Dynamict_)=showString"<<".showsPrec0t.showString">>"-- here so that it isn't an orphan:-- | @since 4.0.0.0instanceExceptionDynamic-- Use GHC's primitive 'Any' type to hold the dynamically typed value.---- In GHC's new eval/apply execution model this type must not look-- like a data type. If it did, GHC would use the constructor convention-- when evaluating it, and this will go wrong if the object is really a-- function. Using Any forces GHC to use-- a fallback convention for evaluating it that works for all types.-- | Converts an arbitrary value into an object of type 'Dynamic'.---- The type of the object must be an instance of 'Typeable', which-- ensures that only monomorphically-typed objects may be converted to-- 'Dynamic'. To convert a polymorphic object into 'Dynamic', give it-- a monomorphic type signature. For example:---- > toDyn (id :: Int -> Int)--toDyn::Typeablea=>a->DynamictoDynv=DynamictypeRepv-- | Converts a 'Dynamic' object back into an ordinary Haskell value of-- the correct type. See also 'fromDynamic'.fromDyn::Typeablea=>Dynamic-- ^ the dynamically-typed object->a-- ^ a default value->a-- ^ returns: the value of the first argument, if-- it has the correct type, otherwise the value of-- the second argument.fromDyn(Dynamictv)def|JustHRefl<-t`eqTypeRep`typeOfdef=v|otherwise=def-- | Converts a 'Dynamic' object back into an ordinary Haskell value of-- the correct type. See also 'fromDyn'.fromDynamic::foralla.Typeablea=>Dynamic-- ^ the dynamically-typed object->Maybea-- ^ returns: @'Just' a@, if the dynamically-typed-- object has the correct type (and @a@ is its value),-- or 'Nothing' otherwise.fromDynamic(Dynamictv)|JustHRefl<-t`eqTypeRep`rep=Justv|otherwise=Nothingwhererep=typeRep::TypeRepa-- (f::(a->b)) `dynApply` (x::a) = (f a)::bdynApply::Dynamic->Dynamic->MaybeDynamicdynApply(Dynamic(Funtatr)f)(Dynamicta'x)|JustHRefl<-ta`eqTypeRep`ta',JustHRefl<-typeRep@Type`eqTypeRep`typeRepKindtr=Just(Dynamictr(fx))dynApply__=NothingdynApp::Dynamic->Dynamic->DynamicdynAppfx=casedynApplyfxofJustr->rNothing->errorWithoutStackTrace("Type error in dynamic application.\n"++"Can't apply function "++showf++" to argument "++showx)dynTypeRep::Dynamic->SomeTypeRepdynTypeRep(Dynamictr_)=SomeTypeReptr
[8]ページ先頭