2013-02-22 8 views
14

C'è un modo in ghci (o ghc) per trovare qual è il tipo inferito di una funzione locale?Trova il tipo dedotto per la funzione locale

E.g. se ho una funzione

f l = map f' l 
    where f' = (+1) 

c'è un modo :t -come in ghci per vedere che cosa il tipo derivato per f' è?

risposta

5

Non conosco alcun modo di farlo da GHCi.

Tuttavia, se si utilizza un editor come Emacs o Vim, è possibile provare ghc-mod. Questo è uno strumento esterno che si collega a un editor e offre alcune funzionalità simili a IDE per i programmi Haskell, inclusa la possibilità di ottenere il tipo di un'espressione arbitraria, inclusa una definizione locale.

In Emacs, si utilizzerà C-c C-t per trovare il tipo di un'espressione.

Se non si utilizza Emacs o Vim, si potrebbe probabilmente avvolgere ghc-mod come estensione GHCi o qualcosa del genere, ma penso che sarebbe un po 'imbarazzante. Non riesco ad immaginare un buon modo per farlo senza avere un'interfaccia simile a un editor. Tuttavia, ghc-mod stesso è solo uno strumento da riga di comando indipendente, quindi è facile lavorarci. Se riesci a pensare ad una buona interfaccia utente per essa indipendente da un editor di testo esistente, prova!

Ovviamente, se non usi Emacs o Vim, probabilmente dovresti: P.

+0

Ho problemi a farlo funzionare, ma questo sembra incredibile! – amindfv

8

In effetti c'è, che ho imparato grazie alla straordinaria risposta di Hammar here. Ecco la versione breve:

Prelude> :l /tmp/foo.hs 
[1 of 1] Compiling Main    (/tmp/foo.hs, interpreted) 
Ok, modules loaded: Main. 
*Main> :break f 
Breakpoint 0 activated at /tmp/foo.hs:(1,1)-(2,18) 
*Main> f [1..10] 
Stopped at /tmp/foo.hs:(1,1)-(2,18) 
_result :: [b] = _ 
[/tmp/foo.hs:(1,1)-(2,18)] *Main> :step 
Stopped at /tmp/foo.hs:1:7-14 
_result :: [b] = _ 
f' :: b -> b = _ 
l :: [b] = _ 
[/tmp/foo.hs:1:7-14] *Main> :t f' 
f' :: b -> b 
+1

Questo mostra solo il tipo di 'f'' in termini di variabili di tipo, che presumo non risponda completamente alla domanda dell'OP. Puoi fare un ulteriore passo in avanti con ': print f'' che forzerà la valutazione di' f''. Quindi ': t f'' mostrerà il tipo concreto. –

+0

Questo è intrigante, non riesco a ottenere il tipo completo, anche con la nota @ Code-Guru. Per esempio. in questo caso dovrebbe essere 'f ':: (Num b) => b -> b' – amindfv

+0

Sì, sarei interessato a una spiegazione del nocciolo qui w/r/t comportamento con e senza un esplicito firma di tipo polimorfico, nonché in presenza di estensioni come "NoMonomorphismRestriction" e forse "MonoLocalBinds". @amindfv quale versione di GHC stai usando? – jberryman

0

Prova hdevtools, è abbastanza veloce e facile da usare, anche se c'è solo l'integrazione per Vim.

+0

Puoi descrivere come ottenere il tipo di un'espressione con hdevtools? – amindfv

+0

hdevtools digita file.hs riga colonna – lethalman

Problemi correlati