Monomorphism by annotation of type variables
Jump to navigation
Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Introduce the reserved word monomo
for rendering type variables monomorphic:
primitive newIORef :: monomo a . a -> IO (IORef a)
Its use in the type signatures for such primitives would prevent the definition of polymorphic references in all contexts - the (abbreviated) canonical example of abuse:
let v = ... $ newIORef undefined in
do writeIORef v ("0" :: [Char])
n <- readIORef v
return (n + 1 :: Int)
...would cause a type error - the type of undefined
is also made monomorphic by the annotated type of newIORef
, resulting in the
type monomo a . IO (IORef a)
for v
, preventing its dual specialisation to IORef [Char]
and IORef Int
.
Definitions relying on the old behaviour would be modified to use, or replaced by new primitives.
Atravers 00:21, 7 January 2019 (UTC)