Hi
I have met a piece of code that cannot be compiled whether I add or remove the NoMonomorphismRestriction flag (as of GHC 7.0.4, Haskell platform 2011.4.0.0).
I have extracted a minimal example below:
{-# LANGUAGE NoMonomorphismRestriction #-}
(f1, f2) =
let commond_definitions = undefined in
let f1 = id.show
f2 x = (< x)
in
(f1, f2)
I needed this format because there are many shared definitions in common_definitions for f1 and f2, and I want to keep them local.
If I compile them with NoMonomorphismRestriction, I get:
D:\work\test.hs:7:8:
Ambiguous type variable `a0' in the constraint:
(Show a0) arising from a use of `f1'
Possible cause: the monomorphism restriction applied to the following:
f1 :: a0 -> String (bound at D:\work\hsOcaml\test.hs:2:2)
Probable fix: give these definition(s) an explicit type signature
In the expression: f1
In the expression: (f1, f2)
In the expression:
let
f1 = id . show
f2 x = (< x)
in (f1, f2)
D:\work\test.hs:7:12:
Ambiguous type variable `a1' in the constraint:
(Ord a1) arising from a use of `f2'
Possible cause: the monomorphism restriction applied to the following:
f2 :: a1 -> a1 -> Bool (bound at D:\work\hsOcaml\test.hs:2:6)
Probable fix: give these definition(s) an explicit type signature
In the expression: f2
In the expression: (f1, f2)
In the expression:
let
f1 = id . show
f2 x = (< x)
in (f1, f2)
Failed, modules loaded: none.
If I comment out
-- {-# LANGUAGE NoMonomorphismRestriction #-}
I get:
D:\work\hsOcaml\test.hs:4:17:
Ambiguous type variable `a0' in the constraint:
(Show a0) arising from a use of `show'
Possible cause: the monomorphism restriction applied to the following:
f1 :: a0 -> String (bound at D:\work\hsOcaml\test.hs:2:2)
Probable fix: give these definition(s) an explicit type signature
or use -XNoMonomorphismRestriction
In the second argument of `(.)', namely `show'
In the expression: id . show
In an equation for `f1': f1 = id . show
D:\work\hsOcaml\test.hs:7:12:
Ambiguous type variable `a1' in the constraint:
(Ord a1) arising from a use of `f2'
Possible cause: the monomorphism restriction applied to the following:
f2 :: a1 -> a1 -> Bool (bound at D:\work\hsOcaml\test.hs:2:6)
Probable fix: give these definition(s) an explicit type signature
or use -XNoMonomorphismRestriction
In the expression: f2
In the expression: (f1, f2)
In the expression:
let
f1 = id . show
f2 x = (< x)
in (f1, f2)
Failed, modules loaded: none.
Can anyone show me why this does not work and how to fix it (e.g. by adding type signature as the error message suggested)?
I tried to add type signature by couldn't figure out the right way of doing it.
Thanks in advance!
Ting