割り当てるために、タプルの第2の値をタプルの最初の値を割り当てた:
- チェックした場合の第二の値タプルは内部にあります
n
これはパターンマッチングとは異なりますrks。
パターンマッチングにwhen
句を追加することで、値と既定の変数を比較するなどの条件を追加できます。このように:
match funToNight with
| (value,x) when x = n -> Some value
| _ -> None
私の意見では、あなたのケースは、まさにパターンマッチングが意味をなさない場合です。 2番目のエントリが自分の乱数であるかどうかを確認したいので、代わりにif
文を使用します。
let MyGirlFriend =
List.pick (fun funToNight ->
let n = rand.Next(10)
if (snd funToNight) = n
then Some (fst funToNight)
else None
) IfancyHerList
の代わりに、fst
とsnd
あなたもラムダでそれを行うことができます。
let MyGirlFriend =
List.pick (fun (name,nr) ->
let n = rand.Next(10)
if nr = n
then Some name
else None
) IfancyHerList
これは他のサイズのタプルでも動作する一般的な解決方法です。fst
とsnd
は、正確に2つの要素を持つタプルでのみ動作します。
さらに、List.pick
の代わりにList.tryPick
を使用します。 List.pick
は、要素が見つからない場合に例外をスローします。先頭の変数は小文字で始まる必要があります。タイプ/クラスには大文字の値が使用されます。だからここ
は完全な作業例です:
let rand = new System.Random()
let ifancyHerList =
[
("Sara",1); ("Saima",2); ("Zoe",3); ("Scarlett",4);
("Jennifer",5);("Sandra Bullock",6)
]
let myGirlFriend =
List.tryPick (fun (name,nr) ->
let n = rand.Next(10)
if nr = n
then Some name
else None
) ifancyHerList
match myGirlFriend with
| Some name -> printfn "Your date for tonight is %A lucky fella" name
| None -> printfn "You don't have a date tonight!"
補遺
あなたList.pick
呼び出しが非常に多くNone
を返し、エントリを選択しません。理由は、List.pick
に渡すラムダ関数の内部で乱数を生成するためです。
コードの現在の "フロー"は、このようなものです。あなたはリストを通過します。最初にピッキングする("Sara",1)
。ランダムに生成すると、5
としましょう。 1
と5
が一致しないので、次のエントリ("Saima", 2)
が使用されます。しかし、新たな乱数を生成すると、3
とし、3
と2
が等しくないため、次のエントリが選択されたとしましょう。これはすべての項目を選択することなく続行できます。ランダム生成をrand.Next(6)
に変更した場合でも
したがって、ラムダ式に副作用を追加しないでください。私はあなたが1つの乱数を生成し、それをリストから選びたいと思っています。ラムダの外側でランダムな呼び出しを抽出することで簡単に変更できます。
let myGirlFriend =
let n = rand.Next(10)
List.tryPick (fun (name,nr) ->
if nr = n
then Some name
else None
) ifancyHerList
一般的なアドバイスでは、高次関数の副作用は避けてください。
この乱数のAPIは関数型プログラミングと互換性がないためです。あなたの擬似乱数ジェネレータは、適切な関数プログラムでは 'next'への引数として渡す必要があり、結果として' pair <> 'で数値と新しい変更状態を取得する暗黙の状態を持っています。あなたは最初にそれをしたくないはずです。 –
あなたは私の答えを受け入れましたが、David Raabの答えははるかに大きかったです。[F#:Matching .. with]と重複する可能性があります(http://stackoverflow.com/questions/38711655/f-not-understanding-match-with) – rmunn
コンプリート。私はあなたが私の答えを受け入れるべきではなく、代わりに彼を受け入れるべきだと感じています。 – rmunn