Каким будет функциональный эквивалент программирования государственного шаблона проектирования? Или более конкретно, как бы this Wikipedia example шаблона государственного дизайна переведет на FP?Функциональный эквивалент шаблона государственного проектирования
ответ
Возможно с помощью монады State
в сочетании с пользовательскими модификаторами и аксессуарами?
Я не думаю, что существует чистый функциональный эквивалент для шаблона состояния. Потому что чисто функциональное программирование не имеет понятия о состоянии и времени. Структура состояния - это внутреннее состояние и время. Но я думаю, что существует нечистый функциональный эквивалент, это бесконечный ленивый оцениваемый поток. Вы можете реализовать его с выходом C#.
FP действительно имеет состояние. Никогда не слышал о монадах? Существует даже что-то, называемое функциональным реактивным программированием для захвата изменяющегося во времени состояния. – fuz
Обратите внимание, что я использовал слова «чистый» и «не чистый» – Dagang
Я не думаю, что «имеет» - это правильное слово для подключения «функционального программирования» и «состояния». Мне нравится думать об этом как о «моделях» - мы можем делать расчеты с учетом состояния, создавая функциональную модель того, что означает государство. – luqui
Этот шаблон является примером использования State monad, вычислительной среды , которая расширяет код с состоянием.
Вот реализация в Haskell.
Некоторые помощники:
import Control.Monad.Trans.State
import Control.Monad.IO.Class
import Data.Char
Два режима работы программы
data Mode = A | B
Тип вычислений с сохранением состояния этого режима, дополненной со счетчиком.
type StateM a = StateT (Int, Mode) IO a
Функция записи, функция в контексте StateM, меняет свое поведение на основе отслеживания состояния режима:
writeName :: String -> StateM()
writeName s = do
(n,mode) <- get
case mode of
A -> do liftIO (putStrLn (map toLower s))
put (0,B)
B -> do let n' = n + 1
liftIO (putStrLn (map toUpper s))
if n' > 1 then put (n', A)
else put (n', B)
Запустите программу, запуск с учетом состояния вычисления первоначально в состоянии A
main = flip runStateT (0, A) $ do
writeName "Monday"
writeName "Tuesday"
writeName "Wednesday"
writeName "Thursday"
writeName "Saturday"
writeName "Sunday"
Из приведенного выше кода выход основного тока:
monday
TUESDAY
WEDNESDAY
thursday
SATURDAY
SUNDAY
Обратите внимание, что это чисто функциональное решение. В этой программе нет изменчивых или деструктивных обновлений. Вместо этого государственная монада направляет нужный режим через вычисление.
Я бы не сказал, что это верная кодировка: здесь мы должны объявить все режимы в одном месте ('Data Mode'), тогда как в примерах википедии примеры могут быть объединены модульно. – luqui
Это стандартный перевод на закрытые типы данных в языках ML-стиля. Очевидно, что мы могли бы отказаться от использования открытых типов данных с помощью функций или классов типов, но я думаю, что это не относится к этой проблеме. –
Мне любопытно, что это стандартный перевод, и что вы подразумеваете под стандартом. – luqui
Одно кодирование:
import Data.Char (toUpper, toLower)
newtype State = State { unState :: String -> IO State }
stateA :: State
stateA = State $ \name -> do
putStrLn (map toLower name)
return stateB
stateB :: State
stateB = go 2
where
go 0 = stateA
go n = State $ \name -> do
putStrLn (map toUpper name)
return $ go (n-1)
Не обманывайте на IO
, это чистый перевод этого шаблона (мы не используем в IORef
для хранения состояния или что-нибудь). Расширение newtype
, мы видим, что означает, что этот тип:
State = String -> IO (String -> IO (String -> IO (String -> ...
Он принимает строку, делает некоторые I/O и запрашивает другую строку и т.д.
Это мое любимое кодирование абстрактных моделей класса в OO: abstract class -> type, subclasses -> элементы этого типа.
Объявление newtype State
заменяет собой декларацию writeName
и ее подпись. Вместо передачи StateContext
, в которое мы назначаем новое состояние, мы просто возвращаем новое состояние.Ввод возвращаемого значения в IO
говорит о том, что новое состояние может зависеть от ввода-вывода. Поскольку это не является технически необходимым в этом примере, мы могли бы использовать более строгий тип
newtype State = State { unState :: String -> (State, IO()) }
, в которых мы можем все еще выразить это вычисление, но последовательность состояний является фиксированной и не может зависеть от ввода. Но давайте придерживаться оригинального, более мягкого типа.
А для «тестового клиента»:
runState :: State -> [String] -> IO()
runState s [] = return()
runState s (x:xs) = do
s' <- unState s x
runState s' xs
testClientState :: IO()
testClientState = runState stateA
[ "Monday"
, "Tuesday"
, "Wednesday"
, "Thursday"
, "Saturday"
, "Sunday" ]
P.S. Вам нужно будет также захватить смену семантики. –
@Don, о, справа. hmm .... – luqui
Для чего это стоит, я бы сказал, что этот стиль кодирования идеален только для истинных OO-идиоматических классов, инкапсулирующих абстрактное поведение. Удручающее количество «классов» в якобы OO-коде гораздо ближе к неуклюжим переводам стиля, которые использовал Дон, и, таким образом, выгоду от того, чтобы вернуться к тому, кем они хотели быть в первую очередь ... –
- 1. Ресурсы для шаблона государственного проектирования, реализованного в PHP?
- 2. Структура государственного образца и доменного проектирования
- 3. Методы перехода в модель государственного проектирования
- 4. Чисто функциональный эквивалент weakhashmap?
- 5. F # функциональный генератор эквивалент
- 6. Функциональный эквивалент молнии Powershell
- 7. Использование шаблона государственного дизайна для cocos2d
- 8. C# do while функциональный эквивалент?
- 9. Функциональный эквивалент итерация 2D-массив
- 10. Функциональный эквивалент сравнения двух списков
- 11. Функциональный эквивалент логике Statement Python
- 12. Редизайн с использованием шаблона государственного дизайна -doubts
- 13. Использование шаблона проектирования адаптера
- 14. Недостатки шаблона проектирования строителя
- 15. Неоднозначность шаблона проектирования Builder
- 16. Выбор шаблона проектирования
- 17. Выбор шаблона проектирования
- 18. Внедрение шаблона проектирования посетителей
- 19. Необходимость шаблона проектирования прототипа?
- 20. Функциональный объект как параметр шаблона
- 21. Функциональный способ реализации стратегического шаблона
- 22. Выбор правильного шаблона проектирования для вычислительных узлов
- 23. Тестирование шаблона шаблона проектирования шаблона шаблона с PHPUnit Mock Objects
- 24. Быстрый функциональный эквивалент для Loop Scala
- 25. SQL Server функциональный эквивалент PostgreSQL «в»
- 26. Есть ли чистый функциональный эквивалент goog.object.extend?
- 27. Функциональный эквивалент выражения if с переменным сравнением
- 28. Каковы недостатки шаблона проектирования фасадов?
- 29. Задачи шаблона проектирования с условиями
- 30. Решение шаблона проектирования/загрузки данных
Согласен, выглядит как конкретное использование 'State' монады для меня тоже. –