Spec-Zone.ru › Haskell 8

Data.Function

Авторские права Nils Anders Danielsson 2006
Alexander Berntsen 2014
Лицензия BSD-стиль (см. файл LICENSE в дистрибутиве)
Поддержка libraries@haskell.org
Стабильность экспериментальная
Переносимость переносимый
Безопасный Haskell Надёжный
Язык Haskell2010

Содержание

  • Prelude реэкспорт
  • Другие комбинаторы

Описание

Простые комбинаторы, работающие только с функциями.

Prelude реэкспорт

id :: a -> a Исходный код

Функция тождества.

id x = x

const :: a -> b -> a Исходный код

const x - это унарная функция, которая вычисляется до x для всех входных значений.

>>> const 42 "hello"
42
>>> map (const 42) [0..3]
[42,42,42,42]

(.) :: (b -> c) -> (a -> b) -> a -> c infixr 9 Исходный код

Композиция функций.

flip :: (a -> b -> c) -> b -> a -> c Исходный код

flip f принимает свои два (первых) аргумента в обратном порядке от f.

>>> flip (++) "hello" "world"
"worldhello"

($) :: forall r a (b :: TYPE r). (a -> b) -> a -> b infixr 0 Исходный код

Оператор применения. Этот оператор избыточен, так как обычное применение (f x) означает то же самое, что и (f $ x). Однако $ имеет низкий, правоассоциативный приоритет связывания, поэтому иногда позволяет опустить скобки; например:

f $ g $ h x  =  f (g (h x))

Он также полезен в ситуациях с высшим порядком, таких как map ($ 0) xs, или zipWith ($) fs xs.

Обратите внимание, что ($) является полиморфным по ленивости в своём типе результата, так что foo $ True где foo :: Bool -> Int# является корректным.

Другие комбинаторы

(&) :: a -> (a -> b) -> b infixl 1 Исходный код

& — это обратный оператор применения. Это обеспечивает удобство обозначений. Его приоритет на один выше, чем у оператора прямого применения $, что позволяет & быть вложенным в $.

>>> 5 & (+1) & show
"6"

С момента: base-4.8.0.0

fix :: (a -> a) -> a Исходный код

fix f — это наименьшая неподвижная точка функции f, т.е. наименьшее определённое значение x такое, что f x = x.

Например, функцию факториала можно записать с помощью прямой рекурсии как

>>> let fac n = if n <= 1 then 1 else n * fac (n-1) in fac 5
120

Это использует тот факт, что let Haskell's introduces рекурсивные привязки. Мы можем переписать это определение с помощью fix,

>>> fix (\rec n -> if n <= 1 then 1 else n * rec (n-1)) 5
120

Вместо вызова рекурсивной функции, мы вводим фиктивный параметр rec; когда он используется в fix, этот параметр ссылается на аргумент fix , таким образом, рекурсия вводится повторно.

on :: (b -> b -> c) -> (a -> b) -> a -> a -> c infixl 0 Исходный код

on b u x y выполняет бинарную функцию b на результатах применения унарной функции u к двум аргументам x и y. С другой стороны, он преобразует два входных значения и комбинирует выходы.

((+) `on` f) x y = f x + f y

Типичное использование: sortBy (compare `on` fst).

Алгебраические свойства:

  • (*) `on` id = (*) -- (if (*) ∉ {⊥, const ⊥})
  • ((*) `on` f) `on` g = (*) `on` (f . g)
  • flip on f . flip on g = flip on (g . f)

© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/8.10.2/docs/html/libraries/base-4.14.1.0/Data-Function.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API