Примечание: если этот вопрос несколько странный, то это потому, что я только недавно познакомился с Haskell и все еще адаптируюсь к функциональному мышлению.
Учитывая тип данных, такой как Maybe
:
data MyOwnMaybe a = MyOwnNothing | MyOwnJust a
все, кто использует мой тип данных, будут писать такие функции, как
maybeToList :: MyOwnMaybe a -> [a]
maybeToList MyOwnNothing = []
maybeToList (MyOwnJust x) = [x]
Теперь предположим, что позднее я захочу расширить этот тип данных.
data MyOwnMaybe a = MyOwnNothing | MyOwnJust a | SuperpositionOfNothingAndJust a
как мне убедиться, что все функции сломаются во время компиляции?
Конечно, есть шанс, что я каким-то образом не "получаю" алгебраические типы данных и, возможно, мне вообще не следует этого делать, но учитывая тип данных Action
data Action = Reset | Send | Remove
казалось бы, добавление лишнего Action
, такого как Add
, не было бы такой уж редкостью (и я бы не хотел рисковать наличием всех этих функций, которые, возможно, не могут справиться с моим новым Action
)
Add
. Это падение вызовет, если я прав, исключение во время выполнения. Это было бы очень нежелательно. - person Werner de Groot   schedule 30.08.2015