Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I refer to the same type variable in different type annotations?

Tags:

haskell

Say I have the following:

import Control.Monad.Random

foo :: IO Float
foo = fmap realToFrac getRandom

GHC rightly complains about not knowing the type of getRandom; I can fix this by doing

foo = fmap realToFrac (getRandom :: IO Double)

However, consider instead the situtation where I have:

foo :: (Functor m, MonadRandom m) => m Float
foo = fmap realToFrac getRandom

I can not do only

foo = fmap realToFrac (getRandom :: m Double)

I must repeat the MonadRandom constraint:

foo = fmap realToFrac (getRandom :: MonadRandom m => m Double)

With a high number of constraints, this would result in a lot of extra typing. I would rather not have to do that. I am aware that I could use ScopedTypeVariables:

{-# LANGUAGE ScopedTypeVariables #-}

import Control.Monad.Random

foo :: MonadRandom m => m Float
foo = do
    x :: Double <- getRandom
    return (realToFrac x)

but this is just as verbose, and additionally I wouldn't be able to apply it in all such situations.

I am also aware of the PartialTypeSignatures proposal. I think this might allow me to do:

foo = fmap realToFrac (getRandom :: _ Double)

but it's not entirely clear from my scan over its (long) description. Unfortunately, PartialTypeSignatures is not ready for primetime and as such has not yet been included in a released version of GHC.

I'm obviously welcome to other suggestions, but one solution to this problem I can think of would be some way to identify m with n in the following:

foo :: (Functor m, MonadRandom m) => m Float
foo = fmap realToFrac (getRandom :: n Double)

Is this kind of thing possible?

like image 938
Josh Kirklin Avatar asked Nov 13 '14 10:11

Josh Kirklin


People also ask

What is __ annotations __ in Python?

Annotations were introduced in Python 3.0 originally without any specific purpose. They were simply a way to associate arbitrary expressions to function arguments and return values. Years later, PEP 484 defined how to add type hints to your Python code, based off work that Jukka Lehtosalo had done on his Ph. D.

What does it mean to annotate a variable?

Variable Annotation is basically an enhancement of type hinting, which was introduced in Python 3.5. The full explanation behind Variable Annotation is explained in PEP 526. In this article, we give have a quick refresher on type hinting and then introduce the new Variable Annotation syntax.

How do you annotate a type in Python?

To annotate return value type, add -> immediately after closing the parameter parentheses, just before the function definition colon( : ): def announcement(language: str, version: float) -> str: ... The function now has type hints showing that it receives str and float arguments, and returns str .

How do you specify variable type in Python?

Specify a Variable Type Casting in python is therefore done using constructor functions: int() - constructs an integer number from an integer literal, a float literal (by rounding down to the previous whole number), or a string literal (providing the string represents a whole number)


1 Answers

Your intuition was correct: ScopedTypeVariables is the right extension for the job:

{-# LANGUAGE ScopedTypeVariables #-}

import Control.Monad.Random

foo :: (Functor m, MonadRandom m) => m Float
foo = fmap realToFrac (getRandom :: m Double)
like image 50
gallais Avatar answered Sep 21 '22 17:09

gallais