Untypeable Haskell 98
From HaskellWiki
(Difference between revisions)
(pattern annotatoins help) |
|||
| Line 1: | Line 1: | ||
| - | + | Here we document code that looks like it should be valid Haskell98, but | |
| - | + | isn't typeable without extensions: | |
| + | <haskell> | ||
f :: a -> a | f :: a -> a | ||
f x = g x | f x = g x | ||
| Line 15: | Line 16: | ||
In GHC making the type of f :: forall a . a -> a, and adding -fglasgow-exts will make this code work. No such luck in Hugs. | In GHC making the type of f :: forall a . a -> a, and adding -fglasgow-exts will make this code work. No such luck in Hugs. | ||
| + | |||
| + | With pattern type annotations, however, the code works in both Hugs and GHC: | ||
| + | |||
| + | <haskell> | ||
| + | f :: a -> a | ||
| + | f (x :: a) = g x | ||
| + | where | ||
| + | g :: a -> a | ||
| + | g y = bind x y | ||
| + | |||
| + | bind :: a -> a -> a | ||
| + | bind a b = a | ||
| + | </haskell> | ||
Revision as of 02:45, 29 August 2006
Here we document code that looks like it should be valid Haskell98, but isn't typeable without extensions:
f :: a -> a f x = g x where -- g :: a -> a g y = bind x y bind :: a -> a -> a bind a b = a
The above Haskell code is Haskell 98, rank-1 types, but cannot be given a type signature. Try commenting out the type signature for g and everything will go wrong.
In GHC making the type of f :: forall a . a -> a, and adding -fglasgow-exts will make this code work. No such luck in Hugs.
With pattern type annotations, however, the code works in both Hugs and GHC:
f :: a -> a f (x :: a) = g x where g :: a -> a g y = bind x y bind :: a -> a -> a bind a b = a
