
Can I import a module when using ghc -e? e.g. ghc -e "import Control.Monad; forM [[1,2,3]] reverse" -- Tony Morris http://tmorris.net/

On Wed, Jan 6, 2010 at 7:23 PM, Tony Morris
ghc -e "import Control.Monad; forM [[1,2,3]] reverse"
As of 6.10.2, the bug whereby the GHC API lets you use functions from anywhere just by naming them (Java-style) has not been fixed: $ ghc -e "Control.Monad.forM [[1,2,3]] reverse" package flags have changed, resetting and loading new packages... <interactive>:1:25: Warning: Defaulting the following constraint(s) to type `Integer' `Num t' arising from the literal `3' at <interactive>:1:25 In the expression: 3 In the expression: [1, 2, 3] In the first argument of `forM', namely `[[1, 2, 3]]' <interactive>:1:25: Warning: Defaulting the following constraint(s) to type `Integer' `Num t' arising from the literal `3' at <interactive>:1:25 In the expression: 3 In the expression: [1, 2, 3] In the first argument of `forM', namely `[[1, 2, 3]]' [[3],[2],[1]] it :: [[Integer]] (0.01 secs, 1710984 bytes) -- gwern

Gwern Branwen wrote:
On Wed, Jan 6, 2010 at 7:23 PM, Tony Morris
wrote: ghc -e "import Control.Monad; forM [[1,2,3]] reverse"
As of 6.10.2, the bug whereby the GHC API lets you use functions from anywhere just by naming them (Java-style) has not been fixed:
$ ghc -e "Control.Monad.forM [[1,2,3]] reverse" package flags have changed, resetting and loading new packages...
<interactive>:1:25: Warning: Defaulting the following constraint(s) to type `Integer' `Num t' arising from the literal `3' at <interactive>:1:25 In the expression: 3 In the expression: [1, 2, 3] In the first argument of `forM', namely `[[1, 2, 3]]'
<interactive>:1:25: Warning: Defaulting the following constraint(s) to type `Integer' `Num t' arising from the literal `3' at <interactive>:1:25 In the expression: 3 In the expression: [1, 2, 3] In the first argument of `forM', namely `[[1, 2, 3]]' [[3],[2],[1]] it :: [[Integer]] (0.01 secs, 1710984 bytes)
I see the same on GHC 6.10.4. $ ghc -e "Control.Monad.forM [[1,2,3]] reverse" [[3],[2],[1]] What would it be fixed to? What is wrong with how it is? -- Tony Morris http://tmorris.net/

On Wed, Jan 6, 2010 at 7:35 PM, Tony Morris
Gwern Branwen wrote:
On Wed, Jan 6, 2010 at 7:23 PM, Tony Morris
wrote: ghc -e "import Control.Monad; forM [[1,2,3]] reverse"
As of 6.10.2, the bug whereby the GHC API lets you use functions from anywhere just by naming them (Java-style) has not been fixed:
$ ghc -e "Control.Monad.forM [[1,2,3]] reverse" package flags have changed, resetting and loading new packages...
<interactive>:1:25: Warning: Defaulting the following constraint(s) to type `Integer' `Num t' arising from the literal `3' at <interactive>:1:25 In the expression: 3 In the expression: [1, 2, 3] In the first argument of `forM', namely `[[1, 2, 3]]'
<interactive>:1:25: Warning: Defaulting the following constraint(s) to type `Integer' `Num t' arising from the literal `3' at <interactive>:1:25 In the expression: 3 In the expression: [1, 2, 3] In the first argument of `forM', namely `[[1, 2, 3]]' [[3],[2],[1]] it :: [[Integer]] (0.01 secs, 1710984 bytes)
I see the same on GHC 6.10.4. $ ghc -e "Control.Monad.forM [[1,2,3]] reverse" [[3],[2],[1]]
What would it be fixed to? What is wrong with how it is?
Presumably one then have to use some sort of flag to ask for Control.Monad specifically to be visible. What's wrong with it is that this is not merely GHCi behavior, this is universal GHC API behavior and wildly insecure: http://hackage.haskell.org/trac/ghc/ticket/2452 -- gwern

On Wed, 6 Jan 2010, Gwern Branwen wrote:
On Wed, Jan 6, 2010 at 7:23 PM, Tony Morris
wrote: ghc -e "import Control.Monad; forM [[1,2,3]] reverse"
As of 6.10.2, the bug whereby the GHC API lets you use functions from anywhere just by naming them (Java-style) has not been fixed:
$ ghc -e "Control.Monad.forM [[1,2,3]] reverse" package flags have changed, resetting and loading new packages...
Why is this a bug? This is the intended behaviour in GHCi and you can include and exclude packages with -package and -hide-package options, respectively.

On Thu, Jan 07, 2010 at 10:23:35AM +1000, Tony Morris wrote:
Can I import a module when using ghc -e?
e.g. ghc -e "import Control.Monad; forM [[1,2,3]] reverse"
One option is to create a file "imports.hs" which contains the text "import Control.Monad", and then run ghc -e "forM [[1,2,3]] reverse" imports.hs I use this method in a short shell script "interact" so that I can apply Haskell functions to files from the command line and don't have to type the full qualified names of things in modules I use frequently. Regards, Reid Barton

On Wed, Jan 6, 2010 at 6:15 PM, Reid Barton
On Thu, Jan 07, 2010 at 10:23:35AM +1000, Tony Morris wrote:
Can I import a module when using ghc -e?
e.g. ghc -e "import Control.Monad; forM [[1,2,3]] reverse"
One option is to create a file "imports.hs" which contains the text "import Control.Monad", and then run
ghc -e "forM [[1,2,3]] reverse" imports.hs
I use this method in a short shell script "interact" so that I can apply Haskell functions to files from the command line and don't have to type the full qualified names of things in modules I use frequently.
Did you know you can put commands in $HOME/.ghci that will be loaded every time you run ghci? So, if you have modules that you commonly use put something like: :m + Control.Monad In your $HOME/.ghci file and then you can use ghci instead of this ghc -e trick. HTH, Jason
participants (5)
-
Gwern Branwen
-
Henning Thielemann
-
Jason Dagit
-
Reid Barton
-
Tony Morris