Главная » Haskell » Окончательные  замечания  о  системе  типов в языке Haskell

0

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

3.6. Окончательные замечания о системе типов в языке Haskell                        89

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

То, что записывается в контексте (Class  a =>), является всего лишь ограничением вида «должен существовать экземпляр указанного класса Class для заданного типа a». Это значит, что типы данных и их реализации для определённых классов существуют раздельно и определяются только экземплярами.

В качестве отличного способа объяснения этого подхода можно рассмотреть пример, когда три разработчика программного обеспечения практически независимо друг от друга (и даже не зная о существовании друг друга) могут совместно поработать над одной задачей. Пусть первый программист создал очень интересный класс VeryInterestingClass, который успешно использовал в своём проекте. Независимо от него второй программист  определил для решения каких-то своих задач некоторый тоже весьма интересный тип данных InterestingDataType. Он тоже успешно использовал это определение в своём проекте, после чего, убедившись, что тип данных достаточно полезен, опубликовал его в виде библиоте-

ки.

Третий программист, ознакомившись с результатами работы первых двух разработчиков, которые даже и знать-то друг о друге не знают, не говоря уже о решённых друг другом задачах, внезапно осознаёт, что результаты работы первых двух программистов можно использовать  для решения одной очень непростой задачи, над которой долгое время безуспешно бились многие и многие умы. Он быстро создаёт некоторую функцию megaImportantFunction,  в сигнатуре которой без колебаний  записывает (троеточие, само собой, не входит в синтаксис языка Haskell, но использовано здесь для умолчания по поводу реализации умозрительной в данном примере функции):

megaImportantFunction :: VeryInterestingClass a => …

Что делать дальше? Ведь тип InterestingDataType совершенно не  связан с классом VeryInterestingClass, но именно такая связь требуется для найденного решения. Конечно, третий программист может самостоятельно пересоздать все прикладные функции класса и  этого типа данных, что позволит избежать связывания. Но зачем это делать, если можно просто определить новый экземпляр класса:

instance VeryInterestingClass  InterestingDataType where

И тут выходит, что нет никакой необходимости искать ни первого программиста, создавшего класс VeryInterestingClass, чтобы он включил в его определение возможность  работать с типом InterestingDataType, ни второго, который мог бы сделать это со  своей стороны. Достаточно в своём модуле реализовать экземпляр этого класса для типа InterestingDataType, что позволит использовать значения этого типа как в функции megaImportantFunction, так и во всех прикладных функциях класса автоматически. И самое главное, исходные модули остаются нетронутыми.

Всё это — серьёзнейшее преимущество  системы типизации языка Haskell.

Источник: Душкин Р. В., Справочник по языку Haskell. М.: ДМК Пресс, 2008. 544 с., ил.

По теме:

  • Комментарии