Поиск…


замечания

Целочисленные литеры

представляет собой цифру без десятичной точки

например, 0 , 1 , 42 , ...

неявно применяется к fromInteger который является частью класса Num type, поэтому он действительно имеет тип Num a => a - то есть он может иметь любой тип, являющийся экземпляром Num


Дробные литералы

представляет собой цифру с десятичной точкой

например, 0.0 , -0.1111 , ...

неявно применяется к fromRational который является частью класса типа Fractional поэтому он действительно имеет тип a => a - то есть он может иметь любой тип, являющийся экземпляром Fractional


Строковые литералы

Если вы добавите расширение языка OverloadedStrings в GHC, вы можете иметь то же самое для String -literals, которые затем применяются к fromString из класса Data.String.IsString

Это часто используется для замены String на Text или ByteString .


Список литературы

Списки могут быть определены с помощью синтаксиса [1, 2, 3] literal. В GHC 7.8 и выше это также можно использовать для определения других типов списка с расширением OverloadedLists .

По умолчанию тип [] :

> :t []
[] :: [t]

С OverloadedLists это становится:

[] :: GHC.Exts.IsList l => l

Целочисленная цифра

Тип литерала

Prelude> :t 1
1 :: Num a => a

выбор конкретного типа с аннотациями

Вы можете указать тип до тех пор, пока целевой тип Num с аннотацией :

Prelude> 1 :: Int
1
it :: Int
Prelude> 1 :: Double
1.0
it :: Double
Prelude> 1 :: Word
1
it :: Word

если не компилятор будет жаловаться

Прелюдия> 1 :: String

<interactive>:
    No instance for (Num String) arising from the literal `1'
    In the expression: 1 :: String
    In an equation for `it': it = 1 :: String

Плавающая цифра

Тип литерала

Prelude> :t 1.0
1.0 :: Fractional a => a

Выбор конкретного типа с аннотациями

Вы можете указать тип с аннотацией типа . Единственное требование - тип должен иметь экземпляр Fractional .

Prelude> 1.0 :: Double
1.0
it :: Double
Prelude> 1.0 :: Data.Ratio.Ratio Int
1 % 1
it :: GHC.Real.Ratio Int 

если не компилятор будет жаловаться

Prelude> 1.0 :: Int
<interactive>:
    No instance for (Fractional Int) arising from the literal `1.0'
    In the expression: 1.0 :: Int
    In an equation for `it': it = 1.0 :: Int

Струны

Тип литерала

Без каких-либо расширений тип строкового литерала, т. Е. Что-то между двойными кавычками, - это просто строка, также называемая списком символов:

Prelude> :t "foo"
"foo" :: [Char]

Однако, когда расширение OverloadedStrings включено, строковые литералы становятся полиморфными, аналогичными литералам чисел :

Prelude> :set -XOverloadedStrings
Prelude> :t "foo"
"foo" :: Data.String.IsString t => t

Это позволяет нам определять значения типа типа string без необходимости каких-либо явных преобразований. По сути, расширение OverloadedStrings просто обертывает каждый строковый литерал в общей fromString преобразования fromString , поэтому, если контекст требует, например, более эффективного Text вместо String , вам не нужно об этом беспокоиться.

Использование строковых литералов

{-# LANGUAGE OverloadedStrings #-}

import Data.Text (Text, pack)
import Data.ByteString (ByteString, pack)


withString :: String
withString = "Hello String"

-- The following two examples are only allowed with OverloadedStrings

withText :: Text
withText = "Hello Text"      -- instead of: withText = Data.Text.pack "Hello Text"

withBS :: ByteString
withBS = "Hello ByteString"  -- instead of: withBS = Data.ByteString.pack "Hello ByteString"

Обратите внимание на то, как мы смогли построить значения Text и ByteString же, как мы строим обычные значения String (или [Char] ), вместо того, чтобы использовать каждую функцию типа pack чтобы явно кодировать строку.

Дополнительные сведения о расширении языка OverloadedStrings см. В документации по расширению .

Список литературы

Расширение GHC OverloadedLists позволяет создавать структуры данных, подобные спискам, с синтаксисом списка литералов.

Это позволяет вам Data.Map следующим образом:

> :set -XOverloadedLists
> import qualified Data.Map as M
> M.lookup "foo" [("foo", 1), ("bar", 2)]
Just 1

Вместо этого (обратите внимание на использование дополнительного M.fromList ):

> import Data.Map as M
> M.lookup "foo" (M.fromList [("foo", 1), ("bar", 2)])
Just 1


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow