Data.Tuple
| Авторские права | (c) Университет Глазго, 2001 |
|---|---|
| Лицензия | в стиле BSD (см. файл libraries/base/LICENSE) |
| Сопровождающий | libraries@haskell.org |
| Стабильность | стабильная |
| Переносимость | переносимая |
| Безопасный Haskell | Безопасный |
| Язык | Haskell2010 |
Описание
Функции, связанные с типами данных кортежей.
Solo — это канонический поднятый 1-кортеж, подобно тому как (,) — канонический поднятый 2-кортеж (пара), а (,,) — канонический поднятый 3-кортеж (тройка).
Важнейшее свойство Solo состоит в том, что его «внешнюю часть» можно вычислить (обычно сопоставлением с образцом), не вычисляя «внутреннюю часть», поскольку он определён как тип данных, а не как newtype. Это может пригодиться, например, при написании функции для извлечения значения из структуры данных. Предположим, вы реализуете массивы и предоставляете только такую функцию для обращения к их элементам:
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 |
Экземпляры
Определено в GHC.Internal.Generics Связанные типы
| |||||
| Monoid a => Monoid (Solo a) Источник | Начиная с: base-4.15 |
||||
| Semigroup a => Semigroup (Solo a) Источник | Начиная с: base-4.15 |
||||
| Eq a => Eq (Solo a) Источник | |||||
| Ord a => Ord (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) Источник | |||||
| 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) Источник | |||||
Определено в GHC.Internal.Generics Связанные типы
| |||||
| Ix a => Ix (Solo a) Источник | |||||
Определено в GHC.Internal.Ix Методыrange :: (Solo a, Solo a) -> [Solo a] Источник index :: (Solo a, Solo a) -> Solo a -> Int Источник unsafeIndex :: (Solo a, Solo a) -> Solo a -> Int Источник inRange :: (Solo a, Solo a) -> Solo a -> Bool Источник rangeSize :: (Solo a, Solo a) -> Int Источник unsafeRangeSize :: (Solo a, Solo a) -> Int Источник | |||||
| Read a => Read (Solo a) Источник | Начиная с: base-4.15 |
||||
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)
Извлекает первый компонент пары.
Извлекает второй компонент пары.
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.14.1/docs/libraries/base-4.22.0.0-66f8/Data-Tuple.html