This looks like a good place to ask a question that's been bugging me for a bit:

I've had cases in my own code where I can't seem to create a type annotation for an "inner" declaration that the type-checker likes.  Here's a toy example:

In the following code:

> applyfunc :: (a -> b -> c) -> a -> b -> c
> applyfunc f x y = doit y where
>                   doit = f x

What type annotation can I successfully apply to the function "doit"?

Thanks,
Antoine

On 4/29/07, Claus Reinke <claus.reinke@talk21.com> wrote:
>On 28/04/07, Georg Sauthoff <g_sauthoff@web.de> wrote:
>> Well, I mention this, because I would like to integrate some
>> lookup feature (for type signatures) into vim (if it doesn't
>> exist yet).
>
>It's worth pointing out that Emacs's haskell-mode already has this.

as do many Vim Haskell modes. for instance, in my own, there are

_t : show type for id under cursor
_T : add type declaration for id under cursor before current line
_si : show info for id under cursor
CTRL-] : jump to definition of id under cursor

'_t' and '_T' use (cached) output from GHCi :browse for the current
and imported modules, '_si' calls GHCi :info, CTRL-] uses the tags
file generated by 'ghc -e :ctags <current>' (which is mapped to '_ct').

see http://www.cs.kent.ac.uk/people/staff/cr3/toolbox/haskell/Vim/
for more info, a tour, and the scripts.

>I did forget to mention that this won't help with your 'offside'
>functions, though.

that, indeed, is the point. if it is reasonably easy to get that information,
without internal identifiers or non-source constructs, and with correct
associations to source code positions, it would be a useful addition to
editor bindings.

it would perhaps be nice to have a wiki page collecting Haskell IDE
features that have been implemented in at least one of the many tools,
so that everybody can try to implement a similar feature set for their
own editor/ide?

there are features that depend on individual preferences, such as
indentation, and there are obvious features that everybody wants,
such as those above, but often, someone somewhere hacks up a
little trick that makes Haskell hacking life a lot easier.

here is a near trivial example from my vimrc file (not even Haskell-
specific):

    map ,{ c{}<esc>P%
    map ,( c()<esc>P%
    map ,[ c[]<esc>P%

this allows me to insert parens by highlighting the part to be enclosed (*).

similarly, the emacs modes have a command to align patterns in
the middle of adjacent lines, such as '=', '::', which is different from
indent, and sounds potentially quite useful, to align multiple equations
and their type declaration, so i've started to reproduce that for vim.

claus

(*) ',(' is mapped to: replace (c) highlighted, insert '()', escape to
    command mode (<esc>), paste cut buffer before current pos
    (P), jump to matching paren (%). so i just highlight an expr and
    hit ',(' to put it in parens, or ',[' to wrap it into a list, etc.

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe