[Haskell-cafe] a code that cannot compile with or without NoMonomorphismRestriction

Ting Lei tinlyx at hotmail.com
Thu Mar 29 08:42:30 CEST 2012





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 . showD:\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  		 	   		  
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20120328/ac7cd74a/attachment.htm>


More information about the Haskell-Cafe mailing list