Data.Tuple
| Авторские права | (c) Университет Глазго 2001 |
|---|---|
| Лицензия | BSD (см. файл libraries/base/LICENSE) |
| Поддержка | libraries@haskell.org |
| Стабильность | стабильная |
| Переносимость | переносимая |
| Safe Haskell | Безопасный |
| Язык | Haskell2010 |
Описание
Функции, связанные с типами данных кортежей.
Solo — это канонический поднятый 1-кортеж, точно так же, как (,) — канонический поднятый 2-кортеж (пара), а (,,) — канонический поднятый 3-кортеж (тройка).
Наиболее важной особенностью Solo является то, что его «внешнюю» часть (обычно с помощью сопоставления с образцом) можно принудительно вычислить, не вычисляя его «внутреннюю» часть, потому что он определен как тип данных, а не как новый тип. Одна из ситуаций, где это может быть полезно, — это написание функции для извлечения значения из структуры данных. Предположим, что вы реализовали массивы и предлагаете только эту функцию для индексирования в них:
index :: Array a -> Int -> a
Теперь представьте, что кто-то хочет извлечь значение из массива и сохранить его в ленивом отображении/словаре конечных значений:
insert "hello" (arr index 12) m
Это фактически может привести к утечке памяти. Значение не извлекается из массива до тех пор, пока это значение (теперь скрытое в отображении) не будет принудительно вычислено. Это означает, что весь массив может оставаться активным, просто из-за этого значения! Часто решением является использование строгого отображения или принудительное вычисление значения перед его сохранением, но для некоторых целей это нежелательно.
Одно из распространённых решений — включить функцию индексирования, которая может произвести свой результат в произвольном Applicative контексте:
indexA :: Applicative f => Array a -> Int -> f a
При использовании indexA в *чистом* контексте, Solo служит удобным Applicative функтором для хранения результата. Вы можете написать не пропускающую память версию предыдущего примера следующим образом:
case arr indexA 12 of Solo a -> insert "hello" a m
Хотя такие простые функции извлечения являются наиболее распространённым применением одноэлементных кортежей, они также могут быть полезны для тонкого управления проходами по структурам данных с жёсткой строкой и для объединения реализаций ленивых и строгих функций отображения.
Конструкторы
| MkSolo a |
Экземпляры
| Foldable1 Solo Источник | С версии: base-4.18.0.0 |
Определено в Data.Foldable1 Методыfold1 :: Semigroup m => Solo m -> m Источник foldMap1 :: Semigroup m => (a -> m) -> Solo a -> m Источник foldMap1' :: Semigroup m => (a -> m) -> Solo a -> m Источник toNonEmpty :: Solo a -> NonEmpty a Источник maximum :: Ord a => Solo a -> a Источник minimum :: Ord a => Solo a -> a Источник foldrMap1 :: (a -> b) -> (a -> b -> b) -> Solo a -> b Источник foldlMap1' :: (a -> b) -> (b -> a -> b) -> Solo a -> b Источник foldlMap1 :: (a -> b) -> (b -> a -> b) -> Solo a -> b Источник foldrMap1' :: (a -> b) -> (a -> b -> b) -> Solo a -> b Источник | |
| Eq1 Solo Источник | С версии: base-4.15 |
| Ord1 Solo Источник | С версии: base-4.15 |
Определено в Data.Functor.Classes | |
| Read1 Solo Источник | С версии: base-4.15 |
Определено в Data.Functor.Classes МетодыliftReadsPrec :: (Int -> ReadS a) -> ReadS [a] -> Int -> ReadS (Solo a) Источник liftReadList :: (Int -> ReadS a) -> ReadS [a] -> ReadS [Solo a] Источник liftReadPrec :: ReadPrec a -> ReadPrec [a] -> ReadPrec (Solo a) Источник liftReadListPrec :: ReadPrec a -> ReadPrec [a] -> ReadPrec [Solo a] Источник | |
| Show1 Solo Источник | С версии: base-4.15 |
Определено в GHC.Internal.Generics Связанные типы
| |||||
| Monoid a => Monoid (Solo a) Исходный код | С момента: base-4.15 |
||||
Определено в GHC.Internal.Base Методыmempty :: Solo a Исходный код mappend :: Solo a -> Solo a -> Solo a Исходный код mconcat :: [Solo a] -> Solo a Исходный код | |||||
| Semigroup a => Semigroup (Solo a) Исходный код | С момента: base-4.15 |
||||
Определено в GHC.Internal.Base Методы(<>) :: Solo a -> Solo a -> Solo a Исходный код sconcat :: NonEmpty (Solo a) -> Solo a Исходный код stimes :: Integral b => b -> Solo a -> Solo a Исходный код | |||||
| Data a => Data (Solo a) Исходный код | С момента: base-4.15 |
||||
Определено в GHC.Internal.Data.Data Методыgfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Solo a -> c (Solo a) Исходный код gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Solo a) Исходный код toConstr :: Solo a -> Constr Исходный код dataTypeOf :: Solo a -> DataType Исходный код dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (Solo a)) Исходный код dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Solo a)) Исходный код gmapT :: (forall b. Data b => b -> b) -> Solo a -> Solo a Исходный код gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Solo a -> r Исходный код gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Solo a -> r Исходный код gmapQ :: (forall d. Data d => d -> u) -> Solo a -> [u] Исходный код gmapQi :: Int -> (forall d. Data d => d -> u) -> Solo a -> u Исходный код gmapM :: Monad m => (forall d. Data d => d -> m d) -> Solo a -> m (Solo a) Исходный код gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Solo a -> m (Solo a) Исходный код gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Solo a -> m (Solo a) Исходный код | |
| Bounded a => Bounded (Solo a) Исходный код | |
Определено в GHC.Internal.Enum | |
| Enum a => Enum (Solo a) Исходный код | |
Определено в GHC.Internal.Enum Методыsucc :: Solo a -> Solo a Исходный код pred :: Solo a -> Solo a Исходный код toEnum :: Int -> Solo a Исходный код fromEnum :: Solo a -> Int Исходный код enumFrom :: Solo a -> [Solo a] Исходный код enumFromThen :: Solo a -> Solo a -> [Solo a] Исходный код enumFromTo :: Solo a -> Solo a -> [Solo a] Исходный код enumFromThenTo :: Solo a -> Solo a -> Solo a -> [Solo a] Исходный код | |
| Generic (Solo a) Source | |||||
Определено в GHC.Internal.Generics Связанные типы
| |||||
| Ix a => Ix (Solo a) Source | |||||
Определено в GHC.Internal.Ix Методыrange :: (Solo a, Solo a) -> [Solo a] Source index :: (Solo a, Solo a) -> Solo a -> Int Source unsafeIndex :: (Solo a, Solo a) -> Solo a -> Int Source inRange :: (Solo a, Solo a) -> Solo a -> Bool Source rangeSize :: (Solo a, Solo a) -> Int Source unsafeRangeSize :: (Solo a, Solo a) -> Int Source | |||||
| Read a => Read (Solo a) Source | С момента: base-4.15 |
||||
| Show a => Show (Solo a) Source | С момента: base-4.15 |
||||
| Eq a => Eq (Solo a) Source | |||||
Определено в GHC.Classes | |
| Ord a => Ord (Solo a) Исходный код | |
Определено в GHC.Classes Методыcompare :: Solo a -> Solo a -> Ordering Исходный код < :: Solo a -> Solo a -> Bool Исходный код <= :: Solo a -> Solo a -> Bool Исходный код > :: Solo a -> Solo a -> Bool Исходный код >= :: Solo a -> Solo a -> Bool Исходный код max :: Solo a -> Solo a -> Solo a Исходный код min :: Solo a -> Solo a -> Solo a Исходный код | |
| type Rep1 Solo Исходный код | С момента: base-4.15 |
Определено в GHC.Internal.Generics | |
| type Rep (Solo a) Исходный код | С момента: base-4.15 |
Определено в GHC.Internal.Generics | |
getSolo :: Solo a -> a Исходный код
Извлечь значение из Solo. Часто значения следует извлекать непосредственно с помощью сопоставления с образцом для контроля того, что оценивается. getSolo используется для удобства в ситуациях, когда это не так:
Когда результат передается в строгую функцию, нет разницы, выполняется ли сопоставление с образцом «снаружи» или «изнутри»:
Data.Set.insert (getSolo sol) set === case sol of Solo v -> Data.Set.insert v set
Обход может выполняться в Solo для управления внутренней оценкой, используя getSolo для извлечения конечного результата. Строгая функция отображения, например, может быть определена
map' :: Traversable t => (a -> b) -> t a -> t b map' f = getSolo . traverse ((Solo $!) . f)
fst :: (a, b) -> a Исходный код
Извлечь первую компоненту пары.
snd :: (a, b) -> b Исходный код
Извлечь вторую компоненту пары.
curry :: ((a, b) -> c) -> a -> b -> c Исходный код
Преобразовать неявную функцию в явную функцию.
Примеры
>>> curry fst 1 2 1
uncurry :: (a -> b -> c) -> (a, b) -> c Исходный код
uncurry преобразует явную функцию в функцию над парами.
Примеры
>>> uncurry (+) (1,2) 3
>>> uncurry ($) (show, 1) "1"
>>> map (uncurry max) [(1,2), (3,4), (6,8)] [2,4,8]
swap :: (a, b) -> (b, a) Исходный код
Поменять компоненты пары.
© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/9.12.1/docs/libraries/base-4.21.0.0-8e62/Data-Tuple.html