Haskell Language
Перегруженные литералы
Поиск…
замечания
Целочисленные литеры
представляет собой цифру без десятичной точки
например, 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