Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
data Bool = True | False, или data Char = 'a' | 'b' | ... Многие типы из приведённых допускают альтернативное описание. С другой же стороны, IO не может быть описан средствами языка, хотя в списке базовых типов не значится.* -> * или более сложных сортов? Да, Int :: *, Char :: *, Bool :: *, но [] :: * -> * уже не подходит.newtype IO a = IO (State# RealWorld -> (# State# RealWorld, a #))
{-
This is a generated file (generated by genprimopcode).
It is not code to actually be used. Its only purpose is to be
consumed by haddock.
-}
-- | @State\#@ is the primitive, unlifted type of states. It has
-- one type parameter, thus @State\# RealWorld@, or @State\# s@,
-- where s is a type variable. The only purpose of the type parameter
-- is to keep different state threads separate. It is represented by
-- nothing at all.
data State# s
-- | @RealWorld@ is deeply magical. It is /primitive/, but it is not
-- /unlifted/ (hence @ptrArg@). We never manipulate values of type
-- @RealWorld@; it\'s only used in the type system, to parameterise @State\#@.
data RealWorld
Prelude> :k []
[] :: * -> *
Prelude> :k Functor
Functor :: (* -> *) -> Constraint
class Tr t v | t -> v where
getVal :: t -> v
getForest :: t -> [t]
*Main> :k Tr Tr :: * -> * -> Constraint
Tr :: (*,*) -> Constraint
data Bool = False | True
data [a] = [] | a : [a]
data [] a = [] | a : ([] a)
IO — не базовый тип, есть тип IO a — он да, самим языком не описывается. Но ничего особенного в плане размещения в памяти нет.(,,,) :: * -> * -> * -> * -> *(Int,Double) :: * Maybe :: * -> *Maybe Int :: *data Ordering = LT | EQ | GT
unsafeCoerce :: a -> b
unsafePerformIO :: IO a -> a
unsafeIOToST :: IO a -> ST s a
unsafeSTToIO :: ST s a -> IO a
Функция с несколькими параметрами
f :: a -> b -> c, что эквивалентно f :: a -> (b -> c).f :: (a, b) -> c. Здесь (a, b) — это не группа параметров, как в языках наподобие Си, а самодостаточный тип, который можно использовать где угодно, в том числе в качестве возвращаемого результата функции.
Конспекты лекций «Haskell как первый язык программирования». Часть1