I’m trying to understand the implementation of typeclasses in Curry so that I can implement them in my compiler.  Is there some documentation describing how dictionaries are implemented, including the naming conventions used?

 

One problem I face is knowing how to choose default instances.  For example, the program “main = 1 + 1” translates to the following FlatCurry:

 

program "test"

  import "Prelude"

  function "test.main" 1

    lhs_vars [1]

    Node "Prelude.apply" (

      Node "Prelude.apply" (

        Node "Prelude.+" (

          var 1 ) ,

        Node "Prelude.apply" (

          Node "Prelude.fromInt" (

            var 1 ) ,

          int 1 ) ) ,

      Node "Prelude.apply" (

        Node "Prelude.fromInt" (

          var 1 ) ,

        int 1 ) )

 

Function “main” expects an implicit argument that is an instance of Prelude.Num.  This is because no type declaration was specified, so its type is “Num a => a”.  If I were to declare main as having a concrete type such as Int or Float, then it would take no arguments.

 

KiCS2 and PAKCS can run this program, so they must somehow choose a default instance.  How is this done?

 

I’m especially bothered that the FlatCurry appears to be missing crucial information – i.e., the fact that “main” expects a Num instance is not mentioned in the FlatCurry.  How do other Curry implementations know to pass a Num dictionary and how is the default instance chosen?

 

-Andy