Аналог команды :t из интерактивного режима ghci
В учебнике по haskell есть раздел посвящённый типам и показана удобная команда :t которой можно посмотреть тип выражений и функций:
ghci> :t 'a'
'a' :: Char
ghci> :t True
True :: Bool
ghci> :t "HELLO!"
"HELLO!" :: [Char]
ghci> :t (True, 'a')
(True, 'a') :: (Bool, Char)
ghci> :t 4 == 5
4 == 5 :: Bool
Поскольку читая текст я тут же пытаюсь всё это выполнить, то я пошёл на ideone.com (к сожалению у меня пока нет возможности поставить локально среду выполнения haskell на своей машине) и написал примерно то же самое:
main = do
putStrLn "Start"
:t 'a'
putStrLn "Finish"
Это не работает, выдаёт ошибку:
Compilation error #stdin compilation error #stdout 0s 0KB
[1 of 1] Compiling Main ( prog.hs, prog.o )
prog.hs:1:5: error:
• Couldn't match expected type ‘IO t0’ with actual type ‘[IO ()]’
• In the expression: main
When checking the type of the IO action ‘main’
|
1 | main = do
| ^
prog.hs:3:10: error:
Variable not in scope:
t :: Char -> (String -> IO ()) -> [Char] -> [IO ()]
|
3 | :t 'a'
| ^
Аналогично не работает и простое:
:t 'a'
выдаёт ошибку:
Compilation error #stdin compilation error #stdout 0s 0KB
[1 of 1] Compiling Main ( prog.hs, prog.o )
prog.hs:1:1: error: parse error on input ‘:’
|
1 | :t 'a'
| ^
Пробовал также через putStrLn ("Finish" ++ show :t 'a') -- тоже не работает.
Подскажите, есть ли какая-то возможность в онлайн-редакторах использовать :t или это возможно только при локальной установке среды haskell и работе с интерактивным режимом через gchi?
Возможно, это не умеет ideone.com но умеют какие-то другие онлайн-ресурсы?
Ответы (2 шт):
Можно использовать typeOf :: forall a. Typeable a => a -> TypeRep для получения объекта TypeRep.
Например:
import Data.Typeable(typeOf)
main = putStrLn ("Finish" ++ show (typeOf 'a'))
К сожалению, подобный подход не сработает с функциями.
Свободный перевод ответа https://stackoverflow.com/a/68428405/5752652 от участника @Willem Van Onsem.
Вы пытаетесь вставить команду интерактивной среды в исходный код своей программы. Это, закономерно, не срабатывает.
Попробуйте вместо ideone использовать сервис repl.it. Там можно в правой панели запустить интерактивную среду командой ghci, а уже в ней использовать и команду :t и прочие её возможности.