Seq.sortBy(fun x -> random.Next()) let assignments = secretSantasAssignments |> Seq.zip people |> Seq.toList if assignments |> Seq.exists (fun a -> fst a = snd a) then assignSecretSantas people else assignments最后,检查了分配,没有将没有人分配给自己。如果有非法分配,该方法将递归执行。现在到了对我来说是新的。发送代码的短信。我听说过Twilio之前但从来没有机会与他们的服务一起玩。设置帐户是您的磨坊的运行创建bet188地址帐户场景。他们甚至为您提供几块雄鹿队试用他们的教程。所以通过我的试用账户和手掌的钱,我实施了短信部分。第一步是添加NuGet package。开发此时,我使用了F#脚本文件。为什么我提到这一点,因为以来F# 5在脚本中添加/使用NuGet包非常简单,并将以下行添加到脚本文件的顶部:#r "nuget: Twilio"open Twilioopen Twilio.Rest.Api.V2010.AccountBut in the final version, I opted for a console app, which uses the standard dotnet add package Twilio to add the package to your project.在能够发送消息之前,需要初始化客户端。let initTwilio = let accountSid = configuration.GetSection("思索").["Sid"] let authToken = configuration.GetSection("思索").["AuthToken"] TwilioClient.Init(accountSid, authToken)I must say the docs来自Twilio在这里是bet188地址很棒的帮助。如果您正在研究更高级的方案,请务必查看它们。使用客户端初始化,我写了代码发送消息:let secretSantaPhoneNumber = "+15551236"let secretSantaMessage = "Testmessage"MessageResource.Create( Twilio.Types.PhoneNumber(secretSantaPhoneNumber), body=secretSantaMessage, from=Twilio.Types.PhoneNumber("思索-Sender-Phone-Number"))发送消息是bet188地址比最初预期更复杂的TAD。相比之下,一切都与我的电话号码合作,我必须在注册时提供。在尝试向家庭中的别人发送测试消息时,我收到了错误的消息来使用先前已在Twilio的试用版注册的数字。修复程序正在进行付费账户 - 但之后,我可以实施秘密圣诞老人的发送:let rec informSecretSantas dryRun (santas: (Person * Person) list) = match santas with | [] -> () | head::tail -> let santaName = (fst head).Name let giftReceiver = (snd head).Name let phoneNumber = (fst head).MobileNumber let body = $"The secret santa message" if dryRun then printfn "%s" body printfn "Sending to %s" phoneNumber else let msg = MessageResource.Create(Twilio.Types.PhoneNumber(phoneNumber), body=body, from=Twilio.Types.PhoneNumber("思索-Phone-Number")) printfn "%A" msg.Status informSecretSantas dryRun tail与那个圣诞节2021年被保存。现在这是最好的选择吗?好吧,有很多服务在那里 - 一些甚至支持短信,不要花费你的东西。但是那里的乐趣在其中bet188地址? ğÿ™ƒ对我来说,使用F#脚本文件的经验雕刻出来的不同部分 - 非常直观。在f#中运行代码REPL / FSI允许快速迭代并尝试。额外的好处是使用Ionide - 使用VS代码开发F#时要安装的插件。和inhate刚刚获得了支持F#5.0的更新。 ğÿ¥³哦,还有另bet188地址建议,如果你保留按下按钮以在FSI中执行代码 - 它将运行多次。询问我的家人在收到之后如何知道,而不是四个秘密的圣诞老人短信在第bet188地址 - 最终运行中。 ğÿ™您可以找到整个代码GitHub.Title photo by Lucie Liz from Pexels">

F#+ Twilio =短信秘密圣诞老人

显示圣诞节礼物的照片

所以随着大流行,圣诞节很有趣,最少说,今年。在Covid-19指导方面,我们今年能够交换我们的秘密圣诞礼物。只有bet188地址问题。我们通常有一点纸制彩票,用于分配秘密圣诞老人。我们倾向于在同一晚上去做。但是,在Covid-19上有那些有必要的东西,今年有这么漂亮。根据彩票部分时,FaceTime很棒但不是那么好,特别是因为没有人应该知道谁得到了谁。

那么bet188地址成功的秘密圣诞老人2021在没有人知道谁挑选谁?为什么不这样做,爆发Visual Studio Code.并编写appbet188地址将为我们执行此操作的小应用程序。所以我将这个过程违背了以下步骤:

  • 阅读输入
  • 随机分配
  • 发送短信

免责声明:我没有收到使用Twilio的任何补偿。我这样做是因为它似乎是bet188地址有趣的项目,短信似乎是每个参与者的最友好的方法。

现在要读取输入,我使用或多或少的标准CSV文件格式如下:

Person1;+15551234
Person2;+15551235

我认为这将允许一些灵活性,并允许我在不共享任何私人联系信息的情​​况下共享代码。 ğÿ〜‰

Reading the input can be done with a few helpers from the .Net Framework living in the System and System.IO namespace.

type Person = { Name : string; MobileNumber : string }

let parseToPerson (inputString:string) =
    let csvItems = inputString.Split(";")
    {Name = csvItems.[0]; MobileNumber = csvItems.[1]}

现在旁边会分配bet188地址秘密圣诞老人的算法。在我们的家庭中,规则很简单。每个人都是别人的秘密圣诞老人,没有人是他或她自己的秘密圣诞老人。通过将列表订购随机数,然后将其提示为CSV文件的顺序来实现随机分配:

let random = Random()
let rec assignSecretSantas (people : Person seq) =
    let secretSantasAssignments =
        people
        |> Seq.sortBy(fun x -> random.下一页())
    
    let assignments = 
        secretSantasAssignments
        |> Seq.zip people
        |> Seq.toList
    
    if assignments |> Seq.exists (fun a -> fst a = snd a) then
        assignSecretSantas people
    else
        assignments

最后,检查了分配,没有将没有人分配给自己。如果有非法分配,该方法将递归执行。

现在到了对我来说是新的。发送代码的短信。我听说过思索之前但从来没有机会与他们的服务一起玩。设置帐户是您的磨坊的运行创建bet188地址帐户场景。他们甚至为您提供几块雄鹿队试用他们的教程。所以通过我的试用账户和手掌的钱,我实施了短信部分。

第一步是添加尼古特包。开发此时,我使用了F#脚本文件。为什么我提到这一点,因为以来F# 5在脚本中添加/使用NuGet包非常简单,并将以下行添加到脚本文件的顶部:

#r "nuget: Twilio"

open 思索
open 思索.Rest.Api.V2010.Account

But in the final version, I opted for a console app, which uses the standard dotnet add package Twilio to add the package to your project.

在能够发送消息之前,需要初始化客户端。

let initTwilio =
    let accountSid = configuration.GetSection("思索").["Sid"]
    let authToken = configuration.GetSection("思索").["AuthToken"]
    思索Client.Init(accountSid, authToken)

我必须说这个译文来自Twilio在这里是bet188地址很棒的帮助。如果您正在研究更高级的方案,请务必查看它们。

使用客户端初始化,我写了代码发送消息:

let secretSantaPhoneNumber = "+15551236"
let secretSantaMessage = "Testmessage"
MessageResource.Create(
    思索.Types.PhoneNumber(secretSantaPhoneNumber), 
    body=secretSantaMessage, 
    from=思索.Types.PhoneNumber("思索-Sender-Phone-Number"))

发送消息是bet188地址比最初预期更复杂的TAD。相比之下,一切都与我的电话号码合作,我必须在注册时提供。在尝试向家庭中的别人发送测试消息时,我收到了错误的消息来使用先前已在Twilio的试用版注册的数字。修复程序正在进行付费账户 - 但之后,我可以实施秘密圣诞老人的发送:

let rec informSecretSantas dryRun (santas: (Person * Person) list) =
    match santas with
    | [] -> ()
    | head::tail ->
        let santaName = (fst head).Name
        let giftReceiver = (snd head).Name
        let phoneNumber = (fst head).MobileNumber
        let body = $"The secret santa message"
        if dryRun then
            printfn "%s" body
            printfn "Sending to %s" phoneNumber
        else
            let msg = MessageResource.Create(思索.Types.PhoneNumber(phoneNumber), body=body, from=思索.Types.PhoneNumber("思索-Phone-Number"))
            printfn "%A" msg.Status
        informSecretSantas dryRun tail

与那个圣诞节2021年被保存。现在这是最好的选择吗?好吧,有很多服务在那里 - 一些甚至支持短信,不要花费你的东西。但是那里的乐趣在其中bet188地址? ğÿ™ƒ

对我来说,使用F#脚本文件的经验雕刻出来的不同部分 - 非常直观。在f#中运行代码repl / FSI. 允许快速迭代并尝试。额外的好处是使用离子 - 使用VS代码开发F#时要安装的插件。和inhate刚刚获得了支持F#5.0的更新。 ğÿ¥³

哦,还有另bet188地址建议,如果你保留按下按钮以在FSI中执行代码 - 它将运行多次。询问我的家人在收到之后如何知道,而不是四个秘密的圣诞老人短信在第bet188地址 - 最终运行中。 ğÿ™

您可以找到整个代码GitHub..

标题照片byLucie Lizpexels.

更新: