В Haskell это невозможно, так как типы стираются во время выполнения. То есть, когда программа запустится, в памяти нет информации о значении индекса let
в типе.
Чтобы преодолеть эту проблему, нам нужно заставить Haskell сохранять в памяти это значение во время выполнения. Обычно это делается с помощью синглтона вспомогательного типа:
data Num = Zero | Succ Num
data SNum (n :: Num) where
SZero :: SNum 'Zero
SSucc :: SNum n -> SNum ('Succ n)
data Something (len :: Num) where
Some :: SNum len -> Something len
. Используя это, вы можете легко написать
sToNum :: SNum n -> Num
sToNum SZero = Zero
sToNum (SSucc n) = Succ (sToNum n)
, а затем
toNum :: Something len -> Num
toNum (Some n) = sToNum n
[1110 ] Если вы ищите "haskell singletons", вы должны найти несколько примеров. Есть даже библиотека singletons
, чтобы частично автоматизировать это.
Если / когда выйдет «зависимый Haskell», у нас будут менее громоздкие инструменты. В настоящее время синглтоны работают, но иногда они доставляют хлопоты. Тем не менее, на данный момент мы должны использовать их.
Я сделал что-то вроде этого прежде, и я основывал свою схему прочь SQL Server sysschedules таблица.
http://technet.microsoft.com/en-us/library/ms178644.aspx
Схема, связанная выше, позволит Вам хранить расписание для задания (событие). Затем можно вычислить, какие даты событие имеет место на основанном прочь расписания. Это может быть долгим вычислением, таким образом, я попытался бы кэшировать тот результат где-нибудь.
Я думаю, что это зависит от типа события, которое это. Похож на это Рождество, где, после того как это приходит и происходит, Вы действительно не интересуетесь им до следующего возникновения? Или действительно ли это - задача как, "Удостоверьтесь, что я звоню своей маме каждый месяц", где, если бы это происходит и Вы пропустили его, Вы не хотели бы, чтобы это ушло?
Одним путем я недавно реализовал последнего, должен был иметь запись, которая имела next_occurrence (дата), reoccurence_period (еженедельно, ежемесячно, ежегодно, и т.д.) столбцы. Так, чтобы, поскольку следующее происшествие approched это обнаружилось бы в списке. После того как это передало элемент списка, будет иметь перерабатывать значок, который когда-то нажал, обновит запись на следующее будущее происшествие.
Снова, я не уверен, относится ли это к Вашей ситуации, но она работала хорошо на мою.