--index :: Integer -> [Char] -> Char index :: (->) Integer ((->) ([] Char) Char) -- am forțat tipul la listă de carcatere index i s = case i of 0 -> head s otherwise -> index (i - 1) (tail s) index2 :: Integer -> [Char] -> Maybe Char index2 i s | null s = Nothing | i == 0 = Just $ head s | otherwise = index2 (i - 1) (tail s) {- kinds \> :k Bool -- nu se construiește peste alte tipuri Bool :: * \> :k Maybe -- se construiește peste un alt tip Maybe :: * -> * \> :k [] [] :: * -> * \> :k (->) -- se construiește peste două alte tipuri (->) :: * -> * -> * \> :t [] -- ATENȚIE: [] ca expresie de date și [] ca expresie de tip sunt lucruri diferite [] :: [a] \> :k [] [] :: * -> * \> :k [Int] -- dacă aplic [] pe un alt tip, obți o valoare constantă de tip, fără variabile [Int] :: * \> :k (,) -- la fel, (,) înseamnă lucruri diferite ca constructor de tip și ca constructor de date (,) :: * -> * -> * \> (,) 1 2 (1,2) \> :i (,) type (,) :: * -> * -> * data (,) a b = (,) a b \> :i -> -- la fel și ->, în expresiile de date este un operator type (->) :: * -> * -> * type (->) = FUN Many :: * -> * -> * -- Defined in `GHC.Types' infixr -1 -> -}