Предположим, что у меня есть тип Thing
с свойством состояния A | B | C
,
и переходы законного состояния A->B, A->C, C->A
.
Я мог бы написать:
transitionToA :: Thing -> Maybe Thing
который возвратил бы Nothing
, если Thing
находился в состоянии, которое не может перейти на A
.
Но я бы хотел определить свой тип и функции перехода таким образом, чтобы переходы можно было вызывать только для соответствующих типов.
Опция заключается в создании отдельных типов AThing BThing CThing
, но в сложных случаях это не выглядит удобным.
Другой подход заключается в кодировании каждого состояния в виде собственного типа:
data A = A Thing
data B = B Thing
data C = C Thing
и
transitionCToA :: C Thing -> A Thing
Это кажется мне более чистым. Но мне пришло в голову, что A, B, C являются функторами, где все функции Things могут отображаться, кроме функций перехода.
С классами я мог бы создать somthing как:
class ToA t where
toA :: t -> A Thing
Что кажется еще более чистым.
Существуют ли другие предпочтительные подходы, которые будут работать в Haskell и PureScript?