2013-02-22 13 views

Odpowiedz

5

Nie znam żadnego sposobu zrobienia tego z GHCi.

Jednakże, jeśli używasz edytora takiego jak Emacs lub Vim, możesz spróbować ghc-mod. Jest to zewnętrzne narzędzie, które podłącza się do edytora i daje trochę funkcji podobnych do IDE dla programów Haskell, w tym możliwość uzyskania typu dowolnego wyrażenia, w tym definicji lokalnej.

W Emacs użyjesz C-c C-t, aby znaleźć typ wyrażenia.

Jeśli nie używasz Emacs, Vim, prawdopodobnie można owinąć GHC-mod jako rozszerzenie GHCi czy coś, ale myślę, że byłoby dość kłopotliwe. Nie potrafię sobie wyobrazić, jak to zrobić, bez edytującego interfejsu użytkownika. Jednak sam ghc-mod jest samodzielnym narzędziem wiersza poleceń, więc łatwo z nim pracować. Jeśli możesz wymyślić dobry interfejs użytkownika, który jest niezależny od istniejącego edytora tekstu, przejdź do niego!

Oczywiście, jeśli nie używasz Emacsa lub Vima, prawdopodobnie powinieneś: P.

+0

Mam problem z działaniem, ale wygląda to niesamowicie! – amindfv

8

Rzeczywiście, jest to, o czym dowiedziałem się dzięki niesamowitej odpowiedzi hammera: here. Oto krótka wersja:

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

Pokazuje tylko typ "f" w kategoriach zmiennych typu, który, jak zakładam, nie odpowiada całkowicie na pytanie OP. Możesz pójść o krok dalej, używając ': print f'', które wymusi ocenę' f''. Następnie ': t f'' wyświetli konkretny typ. –

+0

To jest intrygujące, nie mogę uzyskać pełnego typu, nawet z notatką @ Code-Guru. Na przykład. w tym przypadku powinno to być 'f ':: (Num b) => b -> b' – amindfv

+0

Tak, byłbym zainteresowany wyjaśnieniem nitty-piaszczysty tutaj zachowanie w/r/t zi bez wyraźnego podpis typu polimorficznego, a także w obecności rozszerzeń typu 'NoMonomorphismRestriction' i może' MonoLocalBinds'. @ amindfv jakiej wersji GHC używasz? – jberryman

0

Spróbuj hdevtools, jest dość szybki i łatwy w użyciu, choć nie tylko integracja dla Vima.

+0

Czy możesz opisać, jak uzyskać typ wyrażenia za pomocą hdevtools? – amindfv

+0

hdevtools type file.hs kolumna wiersza – lethalman