[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