2017-12-22 11 views
2

かなり初心者の質問:DateTimeを指定すると、前の非週末の日付をF#にしたいと思います。私はこのように作成しました:F#の前回の作業日

open System 

module Date = 

    let isWeekEnd (date:DateTime) = 
     ((date.DayOfWeek = DayOfWeek.Saturday) || (date.DayOfWeek = DayOfWeek.Sunday)) 

    let getPreviousWorkDay date = 
     while isWeekEnd date do 
      let date = date.AddDays -1.0 
     date 

しかし、私は日付が不変であるという事実に違反しているようです。したがって、私はwhileループでこれをどうやってやっているのだろうかと思っています。なぜなら、シーケンスを3日まで取り戻し、それをフィルタリングして非週末のものをフィルタリングし、最後に最初のものを取り除くのです...

答えて

3

whileあなたが本当に一日前にしてから行くことをされて何をしたい場合には、週末の外出だ場合という

let rec getPreviousWorkDay date = 
    let prevDate = date.AddDays -1.0 
    if isWeekEnd prevDate then getPreviousWorkDay prevDate 
    else prevDate 

注:

let getPreviousWorkDay d = 
    let mutable date = d 
    while isWeekEnd date do 
     date <- date.AddDays -1.0 
    date 

は、そうでなければ、あなたが再帰を使用することができますループアプローチがあなたに変更可能な日付を宣言する必要がありますさらに、あなたの機能は平日を送信する場合に残ります。しかし、あなたはすでに差し引か日を渡すことによってそれを解決することができます。

let getPreviousWorkDay (date:DateTime) = 
    let rec loop date = 
     if isWeekEnd date then loop (date.AddDays -1.0) 
     else date 
    loop (date.AddDays -1.0) 
+0

は素晴らしいと思われます。不変の属性はトリックを作り、これをテストします! –

+0

が働いていれば、(私が使用している)反復関数を修正する自由をとりました。それ以外の場合は、現在の日付を与えただけです。 –

1

whileループを使用しての本質は、あなたが何かを変異することになるだろうことを意味します。ここで

module Date = 
    let getPreviousWorkDay (date:DateTime) = 
     match date.DayOfWeek with 
     | DayOfWeek.Monday -> date.AddDays -3.0 
     | DayOfWeek.Sunday -> date.AddDays -2.0 
     | _ -> date.AddDays -1.0 

は、我々は何を変異させる必要はありません。あなたがこれを行うにはしたくないし、むしろ、より機能的解決策となるだろうなら、あなたはmatch表現を使用することができます。

+0

それは素晴らしいです!私は再帰的な解法を選択しますが、これはより明示的です。 –

関連する問題