Получение последней даты, когда данная неделя день произошло


Я пытаюсь узнать немного о функциональном программировании и как мой инструмент я выбрал Ф# так как я .Net разработчик и окружающая среда является более естественной для меня.

В одном из моих любимых проектов я имею дело с датами, поэтому я создал функцию, чтобы получить дату последнего, где тот или иной день недели не произошло. Например, в прошлый вторник был вчера (Датавремя.Сейчас.AddDays(-1.0)).

#light

module DateTimeExtensions
    open System    

    let rec whenWasLastBasedOnDate (weekDay:DayOfWeek, currentDate:DateTime) = 
        match currentDate with
        | _ when currentDate.DayOfWeek = weekDay -> currentDate
        | _ -> whenWasLastBasedOnDate(weekDay, currentDate.AddDays(-1.0))

    let whenWasLast (weekDay:DayOfWeek) = 
        let currentDate = DateTime.Now
        match currentDate with
        | _ when currentDate.DayOfWeek = weekDay -> currentDate
        | _ -> whenWasLastBasedOnDate(weekDay, currentDate.AddDays(-1.0))    


    let now = DateTime.Now
    let lastSunday = whenWasLast DayOfWeek.Sunday
    let lastMonday = whenWasLast DayOfWeek.Monday
    let lastTuesday = whenWasLast DayOfWeek.Tuesday
    let lastWednesday = whenWasLast DayOfWeek.Wednesday
    let lastThursday = whenWasLast DayOfWeek.Thursday
    let lastFriday = whenWasLast DayOfWeek.Friday
    let lastSaturday = whenWasLast DayOfWeek.Saturday


598
10
задан 2 февраля 2011 в 09:02 Источник Поделиться
Комментарии
1 ответ

Самый очевидный момент состоит в том, что whenWasLast повторяет весь код whenWasLastBasedOnDate. Вы можете (и должны) просто писать весь метод просто позвонив по номеру whenWasLastBasedOnDate:

let whenWasLast (weekDay:DayOfWeek) =
whenWasLastBasedOnDate(weekDay, DateTime.Now)

Другое дело, что вы должны написать AddDays(-1.0) как AddDays -1.0. В языках с ML-подобным синтаксисом это не рекомендуется, чтобы добавить лишние круглые скобки вокруг аргументов функций, потому что это провоцирует ошибочное мнение, что скобки являются частью синтаксиса вызова метода.

На несколько более субъективной точки зрения, я думаю, что через Если бы читал лучше, чем матч без каких-либо узоров.


В более общем дизайне внимание, как правило, считается хорошим стилем в функциональном программировании, чтобы использовать функции высшего порядка, выражающее код более абстрактно. Например вместо того чтобы сказать "проверить, если данный день был будний день. Если так, возвратите это, если не повторить, за день до" можно сказать "смотреть на последние семь дней и вернуть тот, кто в будний день". Это не только более идиоматические функционального программирования, но также делает невозможным, чтобы попасть в бесконечную рекурсию, получив условие выхода неправильно. В коде это будет выглядеть так:

[-6.0..0.0] |> Seq.map currentDate.AddDays |>
Seq.find (fun d -> d.DayOfWeek = weekDay)

11
ответ дан 2 февраля 2011 в 10:02 Источник Поделиться