Czy istnieje sposób wydrukowania przewidywanego typu zagnieżdżonej zmiennej w ghci
? Zastanówmy się, kod,Jakikolwiek sposób wydrukować typ zmiennej w bloku do/while/let?
następnie byłoby miło zapytać o typ g
, np. :t f.g
wydrukuje Int -> Int
.
Czy istnieje sposób wydrukowania przewidywanego typu zagnieżdżonej zmiennej w ghci
? Zastanówmy się, kod,Jakikolwiek sposób wydrukować typ zmiennej w bloku do/while/let?
następnie byłoby miło zapytać o typ g
, np. :t f.g
wydrukuje Int -> Int
.
Możesz wydobyć te informacje, podając odpowiednio nieprawidłową adnotację i sprawdzając komunikat o błędzie.
*Main> let f = g where g::a; g (x::Int) = x
<interactive>:1:23:
Couldn't match type `a1' with `Int -> Int'
`a1' is a rigid type variable bound by...
To zdecydowanie jest wygodniejsze rozwiązanie. Kiedy masz tylko "a", wydaje się, że działa całkiem nieźle. Jednak zdarza się, że mam konkretny przypadek, w którym mam zmienną w bloku do, używając zmiennych o zakresie, gdzie adnotacja typu nie wydaje się niczego ujawniać. (dziwne, może powinienem zgłosić błąd). – gatoatigrado
ghci debugger może go dla Ciebie wydrukujemy z prawidłowo umieszczonym przerwania (ale trzeba załadować definicji w module):
{-# LANGUAGE ScopedTypeVariables #-}
f a = g a where
g (x :: Int) = x
Następnie w ghci:
Prelude> :l tmp2.hs
[1 of 1] Compiling Main (tmp2.hs, interpreted)
Ok, modules loaded: Main.
*Main> :b 3 9
Breakpoint 0 activated at tmp2.hs:3:7-9
*Main> f undefined
Stopped at tmp2.hs:3:7-9
_result :: Int = _
a :: Int = _
g :: Int -> Int = _
[tmp2.hs:3:7-9] *Main>
Znalazłem to łatwiejsze niż inne odpowiedzi, ponieważ czasami dostajesz różne błędy przez wymuszanie typu, ale w ten sposób zawsze znajdziesz typ. –
Czy 'g' nie ma tego samego typu co' f'? ': t f'. –
To był zabawny przykład. – gatoatigrado
Nawiasem mówiąc, w jaki sposób skłoniłeś ghci do zaakceptowania wyciągu wieloliniowego? To nigdy nie zadziałało dla mnie. –