Unknown - haskell-notes

Здесь есть возможность читать онлайн «Unknown - haskell-notes» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Жанр: Старинная литература, на английском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

haskell-notes: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «haskell-notes»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

haskell-notes — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «haskell-notes», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

являются лево-ассоциативными, а операция возведения в степень ( ^) является право-ассоциативной.

1 +2 +3 ==(1 +2) +3

1 ^2 ^3 ==

1 ^(2 ^3)

Приоритет функции можно узнать в интерпретаторе с помощью команды :i:

*FunNat> :m Prelude

Prelude> :i ( +)

class( Eqa, Showa) => Numa where

( +) ::a ->a ->a

...

-- Defined in GHC.Num

infixl6 +

Prelude> :i ( *)

class( Eqa, Showa) => Numa where

...

( *) ::a ->a ->a

...

-- Defined in GHC.Num

infixl7 *

Prelude> :i ( ^)

( ^) ::( Numa, Integralb) =>a ->b ->a

-- Defined in GHC.Real

infixr8 ^

76 | Глава 5: Функции высшего порядка

Приоритет указывается в строчках infixl6 +и infixl7 *. Цифра указывает на старшинство операции,

а суффикс l (от англ. left – левая) или r (от англ. right – правая) на ассоциативность.

Если мы создали свою функцию, мы можем определить для неё ассоциативность. Для этого мы пишем в

коде:

module Fixity where

import Prelude( Num( ..))

infixl4 ***

infixl5 +++

infixr5 ‘neg‘

( ***) =( *)

( +++) =( +)

neg

=( -)

Мы ввели новые операции и поменяли старшинство операций сложения и умножения местами и изме-

нили ассоциативность у вычитания. Проверим в интерпретаторе:

Prelude> :l Fixity

[1 of1] Compiling Fixity

( Fixity.hs, interpreted )

Ok, modules loaded : Fixity.

*Fixity>1 +2 *3

7

*Fixity>1 +++2 ***3

9

*Fixity>1 -2 -3

-4

*Fixity>1 ‘neg‘ 2 ‘neg‘ 3

2

Посмотрим как это вычислялось:

1

+

2

*

3

==

1

+

(2

*

3)

1

+++

2

***3

==

(1

+++

2)

***

3

1

-

2

-

3

==

(1

-

2)

-

3

1 ‘neg‘ 2 ‘neg 3‘ ==

1 ‘neg‘ (2

‘neg‘ 3)

Также в Haskell есть директива infixэто тоже самое, что и infixl.

Приоритет функции композиции

Посмотрим на приоритет функции композиции:

Prelude> :i ( .)

( .) ::(b ->c) ->(a ->b) ->a ->c

-- Defined in GHC.Base

infixr9 .

Она имеет высший приоритет. Она очень часто используется при определении функции в бесточечном

стиле. Такая функция похожа на конвейер функций:

fun a =fun1 a .fun2 (x1 +x2) .fun3 .( +x1)

Приоритет функции применения

Теперь посмотрим на полное определение функции применения:

infixr0 $

( $) ::(a ->b) ->a ->b

f $x

=

f x

Ответ на вопрос о полезности этой функции кроется в её приоритете. Ей назначен самый низкий прио-

ритет. Она будет исполняться в последнюю очередь. Очень часто возникают ситуации вроде:

Приоритет инфиксных операций | 77

foldNat zero succ ( Succb) =succ (foldNat zero succ b)

С помощью функции применения мы можем переписать это определение так:

foldNat zero succ ( Succb) =succ $foldNat zero succ b

Если бы мы написали без скобок:

... =succ foldNat zero succ b

То выражение было бы сгруппировано так:

... =(((succ foldNat) zero) succ) b

Но поскольку мы поставили барьер в виде операции ( $) с низким приоритетом, группировка скобок

произойдёт так:

... =(succ $((foldNat zero) succ) b)

Это как раз то, что нам нужно. Преимущество этого подхода проявляется особенно ярко если у нас

несколько вложенных функций на конце выражения:

xs ::[ Int]

xs =reverse $map (( +1) .( *10)) $filter even $ns 40

ns :: Int ->[ Int]

ns 0

= []

ns n

=n :ns (n -1)

В списке xs мы сначала создаём в функции ns убывающий список чисел, затем оставляем лишь чётные,

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «haskell-notes»

Представляем Вашему вниманию похожие книги на «haskell-notes» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «haskell-notes»

Обсуждение, отзывы о книге «haskell-notes» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x