The `buildDictionary` function takes a Var with a dictionary type, and builds the expression which implements that dictionary.
For instance, you might create a new Var: x :: Num Float and pass that to buildDictionary. It will return: (x, [NonRec x $fNumFloat]) which you could blindly turn into: let x = $fNumFloat in x or you could do what buildDictionaryT (a bit further down in the same module), and spot that case and just return $fNumFloat directly. (The list can have more than one element in the case that dictionaries are built in terms of other dictionaries.) Thus, you've built a dictionary expression of type Num Float. As I understand it, you want to pass something 'log' and get back the dictionary argument. You'll need to choose a type (like Float), but once that is done, it should be easy to use buildDictionary to build the dictionary arguments... just take apart the type of 'log @ Float', make a new Var with the argument type, build a dictionary expression, and apply it. On Thu, Aug 20, 2015 at 5:05 PM, Mike Izbicki <m...@izbicki.me> wrote: > I'm pretty sure the `buildDictionary` function doesn't do what I need. > AFAICT, you pass it a `Var` which contains a dictionary, and it tells > you what is in that dictionary. What I need is a function with type > `Var -> Var` where the first `Var` contains a function, and the output > `Var` is the dictionary. > > For example, given the expression: > > log (a1+a2) > > In core, this might look like: > > log @ Float $fFloatingFloat (+ @ Float $fNumFloat a1 a2) > > I want to mechanically construct the core code above. When doing so, > each function within a type class has an extra argument, which is the > dictionary for that type class. `log` no longer takes one parameter; > in core, it takes two. I'm having trouble figuring out how to get the > appropriate dictionary to pass as the "dictionary parameter" to these > functions. > > On Mon, Aug 17, 2015 at 4:21 PM, Andrew Farmer <afar...@ittc.ku.edu> wrote: >> HERMIT has some code for building dictionaries for a given predicate >> type (by invoking the typechecker functions that do this): >> >> https://github.com/ku-fpg/hermit/blob/master/src/HERMIT/Dictionary/GHC.hs#L223 >> >> The functions to run TcM computations inside CoreM are here: >> >> https://github.com/ku-fpg/hermit/blob/master/src/HERMIT/Monad.hs#L242 >> and >> https://github.com/ku-fpg/hermit/blob/master/src/HERMIT/GHC/Typechecker.hs#L47 >> >> Perhaps that will help get you started? >> >> I would like to push these interfaces back into the GHC API at some >> point, but just haven't done it yet. >> >> HTH >> Andrew >> >> On Mon, Aug 17, 2015 at 4:12 PM, Mike Izbicki <m...@izbicki.me> wrote: >>> I'm not sure how either of those two functions can help me. The >>> problem is that given an operator (e.g. `+`), I don't know the name of >>> the dictionary that needs to be passed in as the first argument to the >>> operator. I could probably hard code these names, but then the plugin >>> wouldn't be able to work with alternative preludes. >>> >>> On Fri, Aug 7, 2015 at 11:20 PM, Edward Z. Yang <ezy...@mit.edu> wrote: >>>> Hello Mike, >>>> >>>> Give importDecl from LoadIface a try, or maybe tcLookupGlobal if >>>> you're in TcM. >>>> >>>> Edward >>>> >>>> Excerpts from Mike Izbicki's message of 2015-08-07 15:40:30 -0700: >>>>> I'm trying to write a GHC plugin. The purpose of the plugin is to >>>>> provide Haskell bindings to Herbie. Herbie >>>>> (https://github.com/uwplse/herbie) is a program that takes a >>>>> mathematical statement as input, and gives you a numerically stable >>>>> formula to compute it as output. The plugin is supposed to automate >>>>> this process for Haskell programs. >>>>> >>>>> I can convert the core expressions into a format for Herbie just fine. >>>>> Where I'm having trouble is converting the output from Herbie back >>>>> into core. Given a string that represents a numeric operator (e.g. >>>>> "log" or "+"), I can get that converted into a Name that matches the >>>>> Name of the version of that operator in scope at the location. But in >>>>> order to create an Expr, I need to convert the Name into a Var. All >>>>> the functions that I can find for this (e.g. mkGlobalVar) also require >>>>> the type of the variable. But I can't find a way to figure out the >>>>> Type given a Name. How can I do this? >>> _______________________________________________ >>> ghc-devs mailing list >>> ghc-devs@haskell.org >>> http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs >>> > _______________________________________________ ghc-devs mailing list ghc-devs@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs