[Haskell-cafe] Re: DSL question -- was: New slogan for haskell.org

Steve Lihn stevelihn at gmail.com
Wed Dec 26 22:28:02 EST 2007


>        arising from use of `/' at DSLTest.hs:11:14-28

Thanks for the example. I am particularly amazed GHC is complaining at
'/', not '+'. The type mismatch occurs (is reported) at much lower
level. It would be nice if there is a way to bump it up a couple
levels...


On Dec 26, 2007 12:56 PM, Bjorn Buckwalter <bjorn.buckwalter at gmail.com> wrote:
> Steve Lihn <stevelihn <at> gmail.com> writes:
>
> > I do come aross a question while reading the DSL page on Wikipedia.
> >
> > http://en.wikipedia.org/wiki/Domain-specific_programming_language
> >
> > In the Disadvantage section (near the end), there is an item -- hard
> > or impossible to debug. Can anybody explain why or what it means? And
> > how does it apply to Haskell?
>
>
> I think I can give a good example of how this can apply to EMBEDDED DSLs. My
> library Dimensional (http://dimensional.googlecode.com) defines what someone
> referred to as a EDSL for working with physical units. The library leverages the
> Haskell type checker to provide static checking of physical dimensions. Without
>  doing this I don't know how I could make such checking static.
>
> The downside of this is that while you will be informed at compile time if you
> physical calculations are incorrect the error message itself is rarely useful.
> Here is an example with lines numbered:
>
>  1 import Numeric.Units.Dimensional.Prelude
>  2 import qualified Prelude
>  3
>  4 -- The angular velocity of Earth's rotation (Soop p. 7).
>  5 phi = 360.985647 *~ (degree / day)
>  6
>  7 -- The gravitational parameter of Earth.
>  8 mu = 3.986004400008003e14 *~ (meter ^ pos3 / second ^ pos2)
>  9
>  10 -- The ideal geostationary radius and velocity.
>  11 r_GEO = cbrt (mu / phi ^ pos2)
>  12 v_GEO = phi * r_GEO
>  13
>  14 -- Something obviously wrong.
>  15 dont_try_this_at_home = v_GEO + mu
>
> Obviously we shouldn't be adding a velocity to a gravitational parameter on line
> 15 and the compiler will catch this. However, this is the error message from
> GHCi (6.6.1):
>
> DSLTest.hs:1:0:
>    Couldn't match expected type `Numeric.NumType.Neg n'
>           against inferred type `Numeric.NumType.Zero'
>    When using functional dependencies to combine
>      Numeric.NumType.Sub a Numeric.NumType.Zero a,
>        arising from the instance declaration at Defined in Numeric.NumType
>      Numeric.NumType.Sub Numeric.NumType.Zero
>                          Numeric.NumType.Zero
>                          (Numeric.NumType.Neg n),
>        arising from use of `/' at DSLTest.hs:11:14-28
>
> I think you will agree that this isn't very helpful in pin-pointing the problem.
> The compiler is pointing at the definition of 'r_GEO' which is twice removed
> from the actual offender. Stuff like this can make EDSLs difficult to debug.
>
> (In this particular example adding type signatures to all definitions will allow
> the compiler to pin-point the error to line 15, although the error message
> remains cryptic.)
>
> Hope that helps,
> Bjorn
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>


More information about the Haskell-Cafe mailing list