gpt4 book ai didi

f# - 无法生成随机数 F#

转载 作者:行者123 更新时间:2023-12-01 07:52:12 28 4
gpt4 key购买 nike

我正在做一个小项目,正在尝试以函数式方式学习 F#,由于某些奇怪的原因,我无法生成随机数,因此无法获得随机日期。这是我的 F# 代码

let IfancyHerList = [("Sara",1); ("Saima",2); ("Zoe",3);("Scarlett",4);
("Jennifer",5);("Sandra Bullock",6)]

let MyGirlFriend = List.pick (fun funToNight ->
let n = rand.Next(10)
match funToNight with
| (value,n ) -> Some value
|_ -> None) IfancyHerList
printfn "Your date for tonight is %s lucky fella" MyGirlFriend

let n = rand.Next(10) 确实生成了一个随机数,但不在匹配块中

任何建议将是最受欢迎的

谢谢

最佳答案

你的代码没有做你期望它做的事情。模式匹配在技术上与构建数据相反。它只是分解/解构数据。

你在这里做什么:

match funToNight with                    
| (value,n ) -> Some value
|_ -> None

具有以下含义:
  • 检查是否 funToNight是一个元组。
  • 将元组的第一个值赋给 value
  • 将元组的第二个值分配给 n

  • 看来你的预期是:
  • 检查元组的第二个值是否在 n 里面

  • 这不是模式匹配的工作方式。

    您可以添加条件,例如通过添加 when 将值与预定义变量进行比较。模式匹配的子句。像这样:
    match funToNight with
    | (value,x) when x = n -> Some value
    | _ -> None

    但在我看来,您的案例正是一个用例,其中模式匹配一​​开始就没有意义。你想检查第二个条目是否是你的随机数,所以使用 if代替声明。
    let MyGirlFriend  =
    List.pick (fun funToNight ->
    let n = rand.Next(10)
    if (snd funToNight) = n
    then Some (fst funToNight)
    else None
    ) IfancyHerList

    而不是 fstsnd你也可以在 lambda 中做到这一点。
    let MyGirlFriend =
    List.pick (fun (name,nr) ->
    let n = rand.Next(10)
    if nr = n
    then Some name
    else None
    ) IfancyHerList

    这是选择的通用解决方案,也适用于其他大小的元组。 fstsnd仅适用于恰好具有两个元素的元组。

    除此之外,您可能想使用 List.tryPick而不是 List.pick . 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 的 lambda 函数中生成了随机数。 .

    您当前的代码“流程”是这样的。你浏览一下列表。第一次采摘 ("Sara",1) .您生成一个随机数,比方说 5 . 15不匹配所以下一个条目 ("Saima", 2)将会被使用。但是然后你又生成了一个新的随机数,比如 3并且选择下一个条目是因为 32不相等。这可以继续,而无需每次都选择任何条目。即使您将随机生成更改为 rand.Next(6) .

    所以一般的建议是你不应该给 lambda 表达式添加副作用。我假设您想生成一个随机数,然后从列表中选择它。通过提取 lambda 之外的随机调用很容易改变。
    let myGirlFriend =
    let n = rand.Next(10)
    List.tryPick (fun (name,nr) ->
    if nr = n
    then Some name
    else None
    ) ifancyHerList

    所以一般建议,避免高阶函数中的副作用。

    关于f# - 无法生成随机数 F#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43934531/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com