Изучай Haskell во имя добра! (Липовача) - страница 173

>50

>10

>30

>5

>90

>20

>40

>2

>25

>10

>8

>0

в файле paths.txt и затем «скормим» его нашей программе.

>$ ./heathrow < paths.txt

>Лучший путь: BCACBBC

>Время: 75

Отлично работает!

Можете использовать модуль >Data.Random, чтобы сгенерировать более длинные системы дорог и «скормить» их только что написанной программе. Если вы получите переполнение стека, попытайтесь использовать функцию >foldl' вместо >foldl и >foldl' (+) 0 вместо >sum. Можно также скомпилировать программу следующим образом:

>$ ghc -0 heathrow.hs

Указание флага >0 включает оптимизацию, которая предотвращает переполнение стека в таких функциях, как >foldl и >sum.

11

Аппликативные функторы

Сочетание чистоты, функций высшего порядка, параметризованных алгебраических типов данных и классов типов в языке Haskell делает реализацию полиморфизма более простой, чем в других языках. Нам не нужно думать о типах, принадлежащих к большой иерархии. Вместо этого мы изучаем, как могут действовать типы, а затем связываем их с помощью подходящих классов типов. Тип >Int может вести себя как множество сущностей – сравниваемая сущность, упорядочиваемая сущность, перечислимая сущность и т. д.

Классы типов открыты – это означает, что мы можем определить собственный тип данных, обдумать, как он может действовать, и связать его с классами типов, которые определяют его поведение. Также можно ввести новый класс типов, а затем сделать уже существующие типы его экземплярами. По этой причине и благодаря прекрасной системе типов языка Haskell, которая позволяет нам знать многое о функции только по её объявлению типа, мы можем определять классы типов, которые описывают очень общее, абстрактное поведение.

Мы говорили о классах типов, которые определяют операции для проверки двух элементов на равенство и для сравнения двух элементов по размещению их в каком-либо порядке. Это очень абстрактное и элегантное поведение, хотя мы не воспринимаем его как нечто особенное, поскольку нам доводилось наблюдать его большую часть нашей жизни. В главе 7 были введены функторы – они являются типами, значения которых можно отобразить. Это пример полезного и всё ещё довольно абстрактного свойства, которое могут описать классы типов. В этой главе мы ближе познакомимся с функторами, а также с немного более сильными и более полезными их версиями, которые называются аппликативными функторами.

Функторы возвращаются

Как вы узнали из главы 7, функторы – это сущности, которые можно отобразить, как, например, списки, значения типа >Maybe и деревья. В языке Haskell они описываются классом типов >Functor, содержащим только один метод