Чтобы понять, что это за типы - шаг за шагом - сначала посмотрите, что такое Maybe и List:
data Maybe a = Nothing | Just a
data [a] = [] | a : [a]
( Может быть ) - это другой тип, чем ( a ), например ( Возможно Int ), отличается от ( Int ).Примеры значений типа ( Может быть Int ): Всего 5 и Ничего .
Список ( a ).) s можно записать как ( [] a ) и как ( [a] ).Примерные значения ( [Int] ): [1,7,42] и [] .
Now, ( IO a ) также отличается от ( a ): это вычисление ввода / вывода, которое вычисляет значение типа ( a ).Другими словами: это скрипт или программа, которая должна быть выполнена для генерации значения типа ( a ).Пример ( IO String ) - getLine , который считывает строку текста из стандартного ввода.
Теперь тип comboBoxGetActive:
comboBoxGetActive :: ComboBoxClass self => self -> IO Int
Это означает, что comboBoxGetActive является функцией ( -> ), которая сопоставляется с любым типом, который имеет экземпляр класса типов ComboBoxClass (примитивные классы типов чем-то похожи на java-интерфейсы) к ( IO Int ).Каждый раз, когда эта функция ( -> ) оценивается с помощью одного и того же входного значения этого типа ( self ) (независимо от того, какой это тип), это приводит к одному и тому же значению:всегда одно и то же значение типа ( IO Int ), это означает, что это всегда один и тот же сценарий.Но когда вы выполняете тот же сценарий в разное время, он может выдавать разные значения типа ( Int ).
Основная функция вашей программы имеет тип ( IO ()), это означает, что компилятор и система времени выполнения оценивают уравнения, которые вы программируете на этом функциональном языке, в значение main, которое будет выполнено, как только вы запустите программу.