Должен ли я использовать Typeclasses или нет?

У меня есть некоторые трудности, чтобы понять, когда использовать, а когда не использовать класс типов в моем коде. Я имею в видусоздать свой собственный, и неиспользовать уже определенный Типовые классы, конечно. К примеру (очень глупый пример), я должен сделать:

data Cars = Brakes | Wheels | Engine
data Computers = Processor | RAM | HardDrive  

class Repairable a where
    is_reparaible :: a -> Bool

instance Repairable Cars where
    is_repairable (Brakes) = True
    is_repairable (Wheels) = False
    is_repairable (Engine) = False

instance Repairable Computers where
    is_repairable (Processor) = False
    is_repairable (RAM)       = False
    is_repairable (HardDrive) = True

checkState :: (Reparaible a) => a -> ... 
checkState a = ...

(Очевидно, это глупый, неполный пример).

Но это много для небольшого использования, нет? Почему я не долженДелать что-то простое и определять только функции без определения новых типов данных и классов типов (с их экземплярами).

Этот пример слишком прост, но на самом деле я часто вижу что-то подобное (новые типы данных + классы типов + экземпляры), когда я просматриваю код на Haskell на github вместо определения только функций.

Итак, когда мне следует создавать новые типы данных, классы типов и т. Д. И когда мне следует использовать функции?

Благодарю.

Ответы на вопрос(2)

Решение Вопроса

Почему я не долженДелать что-то простое и определять только функции без определения новых типов данных и классов типов (с их экземплярами).

Почему так? Вы можете просто определить:

checkState :: (a -> Bool) -> (a -> b) -> (a -> b) -> a -> b
checkState is_repairable repairs destroy a
    = if (is_repairable a) then repairs a else destroy a

Люди постоянно используют классы типа. Это незначит, этоидиоматический.

Чтобы ответить на ваш более общий вопрос, вот несколько практических правил о том, когда использовать классы типов, а когда не использовать их:

Используйте классы типов, если:

Существует только одно правильное поведение для данного типа

Класс типа имеет ассоциированные уравнения (т.е.законы") что все случаи должны удовлетворять

Дон»использовать классы типов, если:

Вы пытаетесь просто именовать вещи. Тот's для чего предназначены модули и пространства имен.

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

Вы обнаруживаете, что расширения, которые вы должны включить, выходят из-под контроля

 Gabriel Gonzalez15 июн. 2013 г., 16:45
@MatumaticOrchid That 'своего рода часть "нужны законы " правило, так как у вас редко будут законы для класса типов только с одним методом (за исключением чего-то вродеSemiGroupгде у вас закон ассоциативности)
 MathematicalOrchid15 июн. 2013 г., 16:00
Я бы добавил к этомудон»использовать классы типов только для одного метода "хотя это неЭто абсолютно жесткое правило, больше похожее на общий намек.
 MathematicalOrchid15 июн. 2013 г., 16:46
@GabrielGonzalez Хороший вопрос. :-)
 vildric14 июн. 2013 г., 04:22
Да уж! Это очень полный ответ, большое спасибо! Ваш "дон»использовать классы типов, если ... » будет особенно полезно выбрать хороший способ сделать что-то.

Часто вы можете использовать тип данных вместо класса типов, например

data Repairable a = Repairable 
   { getRepairable :: a
   , isRepairable :: Bool
   , canBeRepairedWith :: [Tool] -> Bool  -- just to give an example of a function
   } 

Конечно, вам нужно передать это значение явно, но это может быть хорошо, если у вас есть несколько вариантов (например, подумайте оSum а такжеProduct насколько возможноMonoids для чисел). За исключением того, что у вас более или менее такая же выразительность, как и у класса типов.

 ruakh17 апр. 2014 г., 17:30
м не даунотер, но. , , этот ответ нет действительно ответить на вопрос ИМХО. ОП спрашивает, когда следует использовать классы типов. Этот ответ упоминает альтернативу классам типов, но неНе могу сказать, когда использовать эту альтернативу. (Если чтозаключать в себе понимание того, когда классы типов имеют смысл, и предлагает альтернативу, которая имеет смысл во многих одинаковых случаях.)

Ваш ответ на вопрос