Это вопрос о стиле Haskell.Полезно ли создать коллекцию универсальных типов функций в Haskell?
В качестве примера учебника я создал небольшую программу, которая поддерживает операции undo
и redo
. Он использует структуру данных с двумя стеками.
data History a = History [a] [a]
Первый стек - это история, скажем, игры. Второй стек хранит состояния, которые были выбиты undo
. Так
undo (History (x:xs) redoStack) = History xs (x:redoStack)
undo history = history -- in case there is nothing to undo
и
redo (History hStack (x:redoStack)) = History (x:hStack) redoStack
redo history = history -- in case there is nothing to redo
Существует также общая операция, которая применяет изменения текущего состояния.
applyAChange change (History (x:xs) _) = History ((change x):x:xs) []
Тип applyAChange
является
applyAChange :: (a -> a) -> History a -> History a
я решил определить тип Change
:
type Change a = a -> a
Тогда тип applyAChange
становится
applyAChange :: Change a -> Change (History a)
Это показалось полезным, и я использовал Change
типа в другом месте в коде.
При определении String
экземпляр я обнаружил, определяя ряд функций с типами, как:
convertASomethingToString :: Something -> String
Так я определил ToString
тип
type ToString a = a -> String
Это позволило мне напишите предыдущие функции типами
convertASomethingToString :: ToString <Something>
Все, что кажется приятным и делает код более информативным. Мои вопросы:
- Сколько стоит такого рода вещи?
- До тех пор, пока это делается, имеет смысл создать модуль, который состоит из этих типов определений типов и импортировать его? Это стандартная вещь?
- Есть ли уже широко используемый модуль такого рода с полезными типами?
Спасибо.
В поддержку такого типа рефакторинга ваш тип «Change» является повторным изобретением типа «Endo» в «Data.Monoid»: 'newtype Endo a = Endo {appEndo :: a -> a}' , – chepner
@RussAbbott Я бы поставил «текущее состояние» в отдельный слот типа данных вместо того, чтобы связать его с одним из списков. Естественно предположить, что в любом случае всегда будет «текущее состояние». – danidiaz
@chepner, но 'Endo' на самом деле полезен, потому что' Endo a' имеет экземпляр «Monoid». Менее полезно, возможно, «Endo» является экспоненциальным функтором. С другой стороны, синоним типа «Change», похоже, делает немного больше, чем запутывание. Но это мое мнение о синонимах большинства типов. – dfeuer