2016-06-22 29 views
5

Uczę się Haskella przez jakiś czas, więc zdecydowałem się obejrzeć jakiś popularny projekt, aby poczuć, jak to wygląda w rzeczywistości i być może odwrócić proces inżynierii.Znajdź źródło funkcji w Haskell (workflow)

Wybrałem Hakylla, ponieważ robi coś, co znam i jest umiarkowanie skomplikowane. I od razu utknąłem w pytaniu: jak śledzić import?

Powiedz, w JavaScript każdy import jest jawny.

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

Haskell domyślnie

import Q 

który psuje wszystko na raz, a ludzie wydają się naprawdę nadużywanie.

Teraz patrzę na tutorial, następnie u źródła i zdaję sobie sprawę, że nie mam pojęcia, gdzie znajduje się jedna lub druga funkcja i nie mam pojęcia, jak ją znaleźć, z wyjątkiem wyszukiwania.

Czy jest jakaś sztuczka polegająca na wykryciu tego rodzaju informacji, takich jak błąd składni, który ujawniłby plik źródłowy? Jak rozwiązujesz takie zadania w swoim obiegu pracy?

+0

Możesz wyszukiwać nazwy funkcji, a nawet podpisy w hoogle: https://www.haskell.org/hoogle/ – erdeszt

+0

Pamiętaj, że możesz wyraźnie określić, co chcesz zaimportować, pisząc 'import Q (foo)'. Ponadto: użyj [hoogle] (https://www.haskell.org/hoogle/) lub [hayoo] (http://hayoo.fh-wedel.de/), aby wyszukać funkcje haskell. – Bakuriu

+1

@Bururiu - specyfikacja nie może pomóc w inżynierii wstecznej po podaniu kodu i predefiniowaniu. –

Odpowiedz

6

Niektóre opcje, które nie wymagają kodu compilable:

Polecam hoogle Stackage, ponieważ jej baza danych jest ładowany z wszystkich Stackage. Kod

Jeśli praca:

  • użyć polecenia :i w ghci
  • użytkowania GHC-mod pośrednictwem edytora lub Command Line

Jako przykład dwóch ostatnich opcji, załóżmy, że masz moduł Foo.hs, który wygląda tak:

module Foo where 
import Data.Maybe 
... 

Korzystanie 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> 

Korzystanie ghc-mod:

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

Przypuszczam, że masz na myśli: pokażę '- Zdefiniowany w 'GHC.Foo.Bar'' - w porządku. Jeśli chodzi o 'ghc-mod' - czy możesz podać równoważnik stosu. Myślę, że twoja odpowiedź byłaby obszerna z przykładami wydruków. –

+0

Odpowiedź zaktualizowana. Dla 'stack' użyj' stack ghci' aby dostać się do ghci. – ErikR

+0

Nadal nie jest jasne, jak uruchomić polecenie 'ghc-mod' bez platformy Haskell :( –

4

Jeśli używasz Intero for Emacs, obsługuje standard "go do definicji" skrótu M-..

Inne interfejsy Intero prawdopodobnie używają standardowego interfejsu użytkownika edytora dla tej funkcji; Wiem, że jest już NeoVim frontend.

+0

Dziękuję IDE to jedna z możliwych opcji. Czy ktoś wie o dostępności tej funkcji w projekcie" Haskell for Mac "? –

0

Jeśli chcesz korzystać z tego rodzaju pomocy w zakresie przeglądania kodu Haskella w vim, możesz wypróbować ładny samouczek Stephena Diehla: Vim and Haskell in 2016.

Istnieje wiele środowisk edycyjnych dla Haskell, które pozwalają na zapytanie do kompilatora GHC o informacje na temat kodu. Na przykład używam vim-hdevtools i mogę otworzyć plik hakyll/src/Hakyll/Main.hs w vim, przesunąć kursor nad symbol Commands.build, wpisać polecenie :HdevtoolsInfo, a następnie GHC poda mi typ symbolu i miejsce jego zdefiniowania oraz poda ja opcja przejścia do definicji.

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

Jednak muszę przyznać, że nie spędzają dużo czasu getting vim-hdevtools to work.