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