Unknown - haskell-notes

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

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

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

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

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

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

Интервал:

Закладка:

Сделать

un =undefined

findPath ::(a -> Bool) ->[ Patha] -> Maybe[a]

findPath =un

flattenTree ::( Ordh, Orda) => Tree( Patha, h) ->[ Patha]

flattenTree =un

addPath :: Tree(a, h) -> Tree( Patha, h)

addPath =un

data Patha = Path

{ pathEnd

::a

, path

::[a]

}

Обратите внимание на то как поступающие на вход данные разделились между функциями. Информа-

ция о приоритете вершин не идёт дальше функции flattenTree, а предикат isGoal используется только в

функции findPath. Модуль прошёл проверку типов и мы можем детализировать функции дальше:

addPath :: Tree(a, h) -> Tree( Patha, h)

addPath =iter []

whereiter ps t = Node( Pathval (reverse ps’), h) $

iter ps’ <$>subForest t

where(val, h)

=rootLabel t

ps’

=val :ps

В этой функции мы просто присоединяем к данной вершине все родительские вершины, так мы составля-

ем маршрут от данной вершины до начальной, поскольку мы всё время добавляем новые вершины в начало

списка, в итоге у нас получаются перевёрнутые маршруты, поэтому перед тем как обернуть значение в кон-

структор Pathмы переворачиваем список. На самом деле нам нужно перевернуть только один путь. Путь,

который ведёт к цели, но за счёт того, что язык у нас ленивый, функция reverse будет применена не сразу, а

лишь тогда, когда нам действительно понадобится значение пути. Это как раз и произойдёт лишь один раз,

в самом конце программы, лишь для одного значения!

Давайте пока пропустим функцию flattenTree и сначала определим функцию findPath. Эта функция

принимает все вершины, которые мы обошли если бы шли без цели (функции isGoal) и ищет среди них

первую, которая удовлетворяет предикату. Для этого мы воспользуемся стандартной функцией find из мо-

дуля Data.List:

findPath ::(a -> Bool) ->[ Patha] -> Maybe[a]

findPath isGoal =

fmap path .find (isGoal .pathEnd)

Напомню тип функции find, она принимает предикат и список, а возвращает первое значение списка, на

котором предикат вернёт True:

find ::(a -> Bool) ->[a] -> Maybea

278 | Глава 19: Ориентируемся по карте

Функция fmap применяется из-за того, что результат функции find завёрнут в Maybe, это частично опре-

делённая функция. В самом деле ведь в списке может и не оказаться подходящего значения.

Осталось определить функцию flattenTree. Было бы хорошо определить её так, чтобы она была развёрт-

кой для списка. Поскольку функция find является свёрткой (может быть определена через fold), вместе эти

функции работали бы очень эффективно. Мы определим функцию flattenTree через взаимную рекурсию.

Две функции будут по очереди вызывать друг друга. Одна из них будет извлекать следующее значение из

очереди, а другая – проверять не встречалось ли нам уже такое значение, и добавлять новые элементы в

очередь.

flattenTree ::( Ordh, Orda) => Tree( Patha, h) ->[ Patha]

flattenTree a =ping none (singleton a)

ping ::( Ordh, Orda) => Visiteda -> ToVisita h ->[ Patha]

ping visited toVisit

|isEmpty toVisit = []

|otherwise

=pong visited toVisit’ a

where(a, toVisit’) =next toVisit

pong ::( Ordh, Orda)

=> Visiteda -> ToVisita h -> Tree( Patha, h) ->[ Patha]

pong visited toVisit a

|inside a visited

=ping visited toVisit

|otherwise

=getPath a :

ping (insert a visited) (schedule (subForest a) toVisit)

Типы Visitedи ToVisitобозначают наборы вершин, которые мы уже посетили и которые только собира-

емся посетить. Не вдаваясь в подробности интерфейса этих типов, давайте присмотримся к функциям ping и

pong с точки зрения функции, которая их будет вызывать, а именно функции findPath. Эта функция ожидает

на входе список. Внутри она обходит список в поисках нужного элемента, поэтому она будет применять со-

поставление с образцом, разбирая список на части. Сначала она запросит сопоставление с пустым списком,

запустится функция ping с пустым множеством посещённых вершин (none) и одним элементом в очереди

вершин (singleton a), которые предстоит посетить. Функция ping проверит не является ли очередь пустой,

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

Интервал:

Закладка:

Сделать

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

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


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

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

x