Подтвердить что ты не робот

Поддерживает ли Haskell объектно-ориентированное программирование

Поддерживает ли он такие понятия, как разделение декларации и реализации (интерфейсы и классы в Java)? Как насчет ограничения доступа (например, модификаторы доступа в Java)?

Спасибо

4b9b3361

Ответ 1

Как отделить объявление и реализацию в Haskell?

В Haskell вы можете определить typeclass, который сильно отличается от объектно-ориентированного класса, поэтому не позволяйте имени обманывать вас. Используя ключевое слово class, вы можете объявлять имена функций и вводить подписи, которые могут быть созданы (реализованы) в другом месте для определенного типа данных.

Например, Hashable typeclass определяет функцию hash, которая может превратить любой экземпляр типа данных в Int. У вас есть новый, напуганный тип данных, который вы хотите использовать для хеширования? Хорошо, сделайте экземпляр Hashable. Наиболее распространенные типы данных создаются модулем, который определяет Hashable (см. Связанную документацию для "Экземпляры" ).

Typeclasses - это не единственный способ определить интерфейс. Метод, который часто недооценивается, представляет собой обычную старую структуру данных. Поскольку Haskell имеет функции первого класса, вы можете определить структуру данных, которая имеет функции как поля:

data ShuttleInterface =
  SI { launch    :: Delay -> IO Handle
     , deploy    :: Payload -> IO ()
     , getStatus :: IO Status
     }

И ваши функции могут создавать или потреблять эту структуру данных:

deployAllSensors :: ShuttleInterface -> IO ()
deployAllSensors shuttle = do
    status <- getStatus shuttle
    let notDeployed = filter (not . deployed) (sensors status)
    when (isOrbiting status) (mapM_ deploySensor notDeployed)

-- we used the well-known Haskell functions: filter, not, , when, mapM_
-- and some supporting functions were assumed:
isOrbitting :: Status -> Bool
deploySensor :: Sensor -> IO ()
sensors :: Status -> [Sensor]
deployed :: Sensor -> Bool

Как вы ограничиваете доступ к данным в Haskell?

Чтобы обеспечить абстракцию, Haskell использует Алгебраические типы данных. Для защиты разработчиков полей разработчики объявляют тип данных, но не экспортируют его конструкторы - вместо этого они экспортируют только набор безопасных примитивов, которые поддерживают желаемые инварианты.

Например, модуль Map обеспечивает сбалансированное дерево. Он не может гарантировать баланс, если кто-либо может просто объявить карту, используя примитивы Branch и Leaf, поэтому производители не экспортировали их. Конструкция карты должна опираться на то, что экспортируется из Data.Map(и те, у кого есть доступ к/использовать конструкторы в силу того, что они находятся в одном модуле), такие как fromList, empty, singleton и целое куча модификаторов.

Ответ 2

См. Haskell Overlooked Object System Олега Киселева и Ральфа Леммеля для подробного объяснения того, как концепции OO могут быть реализованы в Haskell. Но, как сказал Антал в комментариях, не пытайтесь писать Java-программу в Haskell.

Помните, что объекты являются закрытыми людьми, а закрытие - это плохой человек.

Ответ 3

Типовые классы действительно являются единственными конструкциями, которые напоминают удаленно о концепциях ОО - в данном случае, на интерфейсах. Хотя, в отличие от java, классы типов не являются типами.

Одна из хороших особенностей классов классов заключается в том, что я могу создавать абсолютно несвязанные, уже существующие типы членов класса типов. Если в java иногда думают: эти классы A из пакета org.a и B из com.b, которые я использую, действительно должны реализовывать интерфейс Y из третьего пакета, но нет никакого способа сделать это, что не требовало бы много кода шаблона, дополнительных указаний, сортировки и т.д.

Кстати, как пожилой программист, я хотел бы отметить, что "разделение декларации и реализации" само по себе не имеет ничего общего с ООП. Просто потому, что поддержка большинства OO-langugaes не означает, что концепция не была хорошо известна долгое время до изобретения OO. Заинтересованные подростки, которые думают, что программирование перед тем, как включить OO должно быть в "каменном веке", niveau может искать MODULA, например, где разделение декларации и реализации не только возможно, но и обеспечивается языком.

Ответ 4

Можно отметить одно: объективы. Они позволяют вам написать выражение a.b.c.d.e "в виде компоновки".

. может быть определен для каждой структуры данных. Таким образом, в некотором смысле . является гражданином первого класса в Haskell. Он может быть назван, сохранен, два . -s могут быть скомпилированы и т.д.