2016-06-22 24 views
5

Sto imparando Haskell per un po ', quindi ho deciso di ispezionare qualche progetto popolare per avere un'idea di come sembra nella realtà e forse di decodificare il processo.Trova sorgente di funzioni in Haskell (flusso di lavoro)

Ho scelto Hakyll perché fa qualcosa che mi è familiare ed è moderatamente complesso. E poi mi sono nascosta immediatamente con la domanda: come fare il backtrace delle importazioni?

Dire, in JavaScript ogni importazione è esplicita.

let Q = require("Q")   // namespace 
let {foo} = require("Q/foo") // value 

Haskell default

import Q 

che rovina tutto in una volta e le persone sembrano abusare davvero.

Ora guardo lo tutorial, quindi alla fonte e mi rendo conto che non ho idea di dove si trovi l'una o l'altra funzione e non ho idea di come scoprirlo tranne la ricerca.

C'è qualche trucco per scoprire questo tipo di informazioni come fare errori di sintassi che rivelerebbero il file sorgente o altro? Come risolvete tali compiti nel vostro flusso di lavoro?

+0

È possibile cercare nomi di funzioni o anche firme in hoogle: https://www.haskell.org/hoogle/ – erdeszt

+0

Si noti che è possibile specificare esplicitamente cosa si desidera importare scrivendo 'import Q (foo)'. Inoltre: usa [hoogle] (https://www.haskell.org/hoogle/) o [hayoo] (http://hayoo.fh-wedel.de/) per cercare le funzioni haskell. – Bakuriu

+1

@Bakuriu: le specifiche non possono essere d'aiuto per il reverse engineering quando il codice viene fornito e predefinito. –

risposta

6

Alcune opzioni che non richiedono il codice compilabile:

raccomando Hoogle di Stackage dal suo database è caricato con tutti Stackage. Codice

Se avete a lavorare:

  • utilizzare il comando :i in ghci
  • uso GHC-mod attraverso il vostro editore o riga comandi

Come esempio delle ultime due opzioni, supponiamo che tu abbia un modulo Foo.hs che assomiglia a:

module Foo where 
import Data.Maybe 
... 

Utilizzando ghci:

$ ghci Foo.hs 
GHCi, version 7.10.2: http://www.haskell.org/ghc/ :? for help 
[1 of 1] Compiling Foo    (Foo.hs, interpreted) 
Ok, modules loaded: Foo. 
*Foo> :i catMaybes 
catMaybes :: [Maybe a] -> [a] -- Defined in ‘Data.Maybe’ 
*Foo> 

Utilizzando ghc-mod:

$ ghc-mod info Foo.hs catMaybes 
catMaybes :: [Maybe a] -> [a] -- Defined in ‘Data.Maybe’ 
$ 
+0

Suppongo che tu voglia dire: mostrerò '- Definito in 'GHC.Foo.Bar'' - va bene. Per quanto riguarda 'ghc-mod' - potresti fornire uno stack equoivalente. Penso che la tua risposta sarebbe completa con esempi di output. –

+0

Risposta aggiornata. Per 'stack' usa' stack ghci' per entrare in ghci. – ErikR

+0

Ancora non è chiaro come eseguire il comando 'ghc-mod' senza una piattaforma Haskell :( –

4

Se si utilizza Intero for Emacs, supporta lo standard "Vai a definizione" scorciatoia di M-..

Altri frontend di Intero probabilmente usano anche l'interfaccia utente standard del loro editor per questa funzionalità; So che c'è già uno NeoVim frontend.

+0

Grazie IDE è una delle opzioni possibili Chiunque è a conoscenza della disponibilità di questa funzionalità nel progetto" Haskell per Mac "? –

0

Se si desidera questo tipo di supporto per la ricerca del codice Haskell in vim, si potrebbe provare il bel tutorial di Stephen Diehl Vim and Haskell in 2016.

Esistono numerosi ambienti di modifica per Haskell che consentono di eseguire query sul compilatore GHC per informazioni sul codice. Ad esempio, io uso vim-hdevtools, e posso aprire il file hakyll/src/Hakyll/Main.hs in vim, spostare il cursore sul simbolo Commands.build, digitare il comando :HdevtoolsInfo, e poi GHC mi dirà il tipo di simbolo e dove è definita, e dare io ho la possibilità di saltare alla definizione.

Commands.build :: 
    Config.Configuration -> Logger.Logger -> Rules a -> IO ExitCode 
     -- Defined at hackyll/src/Hakyll/Commands.hs:48:1 

Tuttavia, confesso che ho fatto spendere un sacco di tempo getting vim-hdevtools to work.