如何使用 F# 发牌

2023-12-01

我一直致力于使用 F# 对流行纸牌游戏(情书)进行建模,以了解有关函数式编程的更多信息。

module Game = 
open Cards
open Players

type Deck = Card list

let dealACard (deck:Deck) = 
    let randomGenerator = System.Random()
    let index = randomGenerator.Next deck.Length
    let card = deck.Item index
    (card, (deck |> List.filter((<>) card)))

let createPlayer playerNumber deck =
    let card, newDeck = dealACard deck
    ({cards=[card]; playerNumber=playerNumber}, newDeck)

在我开始学习如何建模如何绘制卡片之前,我一直表现得很好。为了测试这一点,我想从牌堆中抽出所有牌。我的程序看起来像这样:

let deck = createDeck
while not deck.IsEmpty do
    let card, newDeck = dealACard deck
    // print the card
    // how do I update the deck?

任何帮助或反馈都会很棒。


F# 列表是不可变的, so if deck.IsEmpty开始false,它会留下来false永远。不过,确实没有理由让事情变得如此复杂。

假设你有一个排序好的牌组。我们仅使用三张牌作为示例,但假设它是一副完整的牌:

let deck =
    [
        { Suit = Hearts; Face = Queen }
        { Suit = Diamonds; Face = King }
        { Suit = Spades; Face = Ace }
    ]

您可以使用随机数生成器轻松打乱牌组:

let r = Random ()
let scrambledDeck = deck |> List.sortBy (fun _ -> r.Next ())

第一次创建时scrambledDeck,在 FSI 中可能如下所示:

> let scrambledDeck = deck |> List.sortBy (fun _ -> r.Next ());;

val scrambledDeck : Card list =
  [{Suit = Spades;
    Face = Ace;}; {Suit = Hearts;
                   Face = Queen;}; {Suit = Diamonds;
                                    Face = King;}]

但如果你再做一次,它可能看起来像这样:

> let scrambledDeck = deck |> List.sortBy (fun _ -> r.Next ());;

val scrambledDeck : Card list =
  [{Suit = Spades;
    Face = Ace;}; {Suit = Diamonds;
                   Face = King;}; {Suit = Hearts;
                                   Face = Queen;}]

现在你已经有了一副打乱的牌,你可以简单地开始从上面拉出牌,例如为了打印它们:

scrambledDeck |> List.iter (printfn "%O")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 F# 发牌 的相关文章

  • std::bind 重载解析

    下面的代码工作正常 include
  • F# 命名约定

    F 是否有 官方 命名 大小写约定 我总是怀疑是否使用 C 风格 Class MyFunctionName or Module my function name 在 F 中 您应该混合 BCL 类和 F 库类 它们具有不同的大小写 并且代码
  • 你能在 scala 中使用 varargs 柯里化一个函数吗?

    我正在考虑如何用可变参数柯里化一种方法 然后我意识到我什至不知道如何去做 理想情况下 它应该让您可以随时开始使用它 然后以可迭代结束 def concat strs String strs mkString val curriedConca
  • F# 尝试处理未处理的异常

    在下面的代码中 我想读取一个文件并返回所有行 如果存在 IO 错误 我希望程序退出并将错误消息打印到控制台 但程序仍然遇到未处理的异常 对此的最佳实践是什么 我想我不需要Some None因为无论如何我都希望程序在错误时退出 谢谢 let
  • 函数式 Scala 中的选择排序

    我正在学习 Scala 编程 并编写了选择排序算法的快速实现 然而 由于我对函数式编程还不太了解 所以在转换为更 Scala 风格时遇到了困难 对于 Scala 程序员来说 如何使用 Lists 和 vals 来做到这一点 而不是回到我的命
  • 使用不区分大小写的比较从集合中减去记录

    我有一组记录 type Person Name string Age int let oldPeople set Name The Doctor Age 1500 Name Yoda Age 900 与上面的硬编码示例不同 这组数据实际上来
  • 带表达式的 F# 类型定义

    是否可以这样表达 type id int gt 0 我知道它不可能静态执行 因为这意味着 F 具有依赖类型 在 C 中 我习惯于使用代码契约来执行此类操作并获得运行时强制执行 我正在这里寻找类似的东西 Thanks 编辑 感谢您提供的所有答
  • 使用 Reader Monad 进行依赖注入

    我最近看到了谈话极其简单的依赖注入 http www youtube com watch v ZasXwtTRkio and 无需体操的依赖注入 http vimeo com 44502327关于 Monads 的 DI 并留下了深刻的印象
  • 函数式语言中的部分求值和函数内联有什么区别?

    我知道 函数内联就是用函数定义代替函数调用 部分评估是在编译时评估程序的已知 静态 部分 在 C 等命令式语言中 两者之间存在区别 其中运算符与函数不同 但是 在像 Haskell 这样的函数式语言 其中运算符也是函数 中 两者之间有什么区
  • F# 中的选项类型如何工作

    因此 我一直在阅读 Apress 的 Expert F 书籍 主要将其用作构建玩具式 F 库时的参考 但有一点我未能掌握 那就是 Option 类型 它是如何工作的以及它在现实世界中的用途是什么 选项类型至少为similar to Null
  • Scala 函数定义参数列表中不同的括号样式

    Scala 中以下两个函数定义有什么区别 1 def sum f Int gt Int a Int b Int Int code 2 def sum f Int gt Int a Int b Int Int code SBT 的控制台 RE
  • true 和布尔列表 f# 的长度

    直接使用递归 写一个函数truesAndLength bool list gt int int那 返回列表的长度 在该对的第一个组件中 以及列表的数量 列表中正确的元素 在第二个组件中 你的函数必须只迭代 遍历列表的元素一次 请勿使用 Li
  • 某些数据结构是否比其他数据结构更适合函数式编程?

    In 现实世界哈斯克尔 http book realworldhaskell org 有一个标题为 没有数组或哈希表的生活 的部分 其中作者建议在函数式编程中首选列表和树 而在命令式程序中可能会使用数组或哈希表 这是有道理的 因为在创建新列
  • 如何从 C# 可移植类库 (PCL) 添加对 F# 可移植库的引用

    我有一个项目 其中包含两个 F 项目和一个 C 项目 我想在其中编写一些 XUnit 测试 FS PL F 3 1 3 3 1 0 可移植库 FS PL Legacy F 31 2 3 5 1 可移植库 旧版 测试 C NET 4 5 Wi
  • 返回带有参数的函数的函数

    创建一个应返回包含原始函数参数的函数时 我应该如何处理 例如考虑这个函数 a lt function value function x x value 我希望它返回我在结果函数的参数中指定的值 如下所示 b lt a 3 gt b gt f
  • 如何从 f# 返回一个空元组到 c#? [复制]

    这个问题在这里已经有答案了 我有这个类型正确的 C 函数 static System Tuple
  • Async.AwaitTask 在 f# 中如何工作?

    我知道 f 和 c 异步模型之间的主要区别在于 在 f 中 除非您调用 Async RunSynchronously 之类的内容 否则异步执行不会开始 在 C 中 当方法返回任务时 通常 并非总是 立即在后台线程中开始执行 Async Aw
  • Scala 功能设计模式目录

    一周以来我一直在阅读 Scala 编程 作者一步一步地介绍了该语言的元素 但我仍然很困惑何时使用演员 闭包 柯里化等功能性的东西 我正在寻找功能结构的典型用例或最佳实践的目录 我并不是说在 Scala 中重新实现像 GoF 这样的众所周知的
  • IntSummaryStatistics的summaryStatistics方法

    为什么空 IntStream 上的 summaryStatistics 方法返回整数的最大和最小值作为流中存在的最大和最小 int 值 IntStream intStream IntStream of IntSummaryStatistic
  • 需要澄清令人困惑的 Http4s 消息类型 `Response[F]` / `Request[F]`

    我很难理解为什么Request and Response参数化为F 类似的东西是猫效应数据类型资源 从文档中 https typelevel org cats effect docs std resource https typelevel

随机推荐

  • 使用加载了 Ajax 内容的 jQuery“点击”功能?

    我有一个通过 Ajax 加载的 php 文件的内容 其中包含 HTML 和 JavaScript 我有一个按钮
  • 在 Visual Studio Web 测试中转义上下文参数格式

    我正在尝试弄清楚如何通过 Visual Studio Web 测试在 POST 中传递特定的数据 而不将其识别并视为上下文参数 POST 包含一个 字符串 主体 它是一个 json 文档 身体的一部分包括如下内容 My Attribute
  • Emacs 区域高亮显示

    有没有办法在字体锁定模式打开的缓冲区中突出显示文本中的字符串 但不是所有此类字符串 假设我有一个 SQL 模式的缓冲区 我想突出显示其中的一个字符串 下面的代码不起作用 set text properties 10 20 face hi y
  • 康康舞能力在单独的文件中

    是否可以在单独的文件中定义能力并将其包含在初始化方法内的ability rb文件中 下面的代码返回 尝试并得到 未定义的方法 can 能力 rb def initialize user include MyExtension Somethi
  • 简化反三角代码(While 循环)

    我已经成功创建了一个代码来使用 while 循环打印水平翻转的三角形 现在虽然它有效 但我想知道是否可以简化它 即不使用 store 变量 但我想用 while 循环保留它 当前代码是 myLen int input Enter the n
  • 使用 firebase-queue 返回任务结果

    我正在使用 Firebase 开发移动应用程序 在移动应用程序中 我需要根据用户的手机号码注册用户 类似于 Whatsapp 我打算使用 Nexmo 来验证用户的手机号码 验证号码涉及两个步骤 将用户手机号码发送到 Nexmo API 成功
  • Hadoop 选项没有任何效果(mapreduce.input.lineinputformat.linespermap、mapred.max.map.failures.percent)

    我正在尝试实现一个 MapReduce 作业 其中每个映射器将占用文本文件的 150 行 并且所有映射器将同时运行 此外 无论有多少映射任务失败 它都不应失败 这是配置部分 JobConf conf new JobConf Main cla
  • 承诺链接:在下一个回调中使用前一个承诺的结果[重复]

    这个问题在这里已经有答案了 我正在使用直接的 ES6 Promise 使用 es6 promise polyfill 库 并且在访问链接的 Promise 中的先前 Promise 的结果时遇到了问题 这个问题在 Angular Q 的上下
  • JavaScript - 循环比逐行离散编写更快吗?

    忽略所有代码的简洁性和可读性 哪个脚本会更快完成 This for var i 0 i lt 10 i do that thing Or this do that thing do that thing do that thing do t
  • 确定连续日期

    我有一个清单datetime dates我需要检查每个日期是否来自下一个连续月份 希望代码中我的意思很清楚 import datetime from unittest import TestCase def is consecutive d
  • 如何在 mongoDB 中获取多个匹配过滤器计数

    我收集了大约 50000 份文档 集合架构如下所示 param1 Boolean param2 Boolean param3 Boolean param4 Boolean etc 我应该如何查询数据库 以获取每个匹配的参数计数 目前 我正在
  • 如何使用 JavaScript 删除加载视图中的所有 Chrome 通知?

    这是我在 Google Chrome 中显示通知的代码 如何在代码中关闭通知 document addEventListener DOMContentLoaded function if Notification alert Desktop
  • Facebook 提供商未配置。确保添加“facebook_application_id”字符串

    我正在使用 Firebase UI 登录并尝试在我的 Android 应用程序中实现 Facebook 登录 启动 firebase ui 活动时我得到 java lang IllegalStateException Facebook 提供
  • 用于个人粉丝页面的 Facebook Messenger 聊天机器人

    我使用 Dialogflow 创建了一个聊天机器人 将其连接为我的个人粉丝页面 我的应用程序的粉丝页面 的 Facebook Messenger 聊天机器人 我通过了第一次审核并获得批准 下一步是 验证我的业务 我不是一家企业 我只是一个个
  • 在窗口应用程序中使用 HttpContext.Current.Server.MapPath?

    我可以在窗口应用程序中做这样的事情吗 HttpContext Current Server MapPath Email ForgotPassword txt 该项目是一个基于网络的应用程序 我的下一个项目基本上是一个窗口服务 寻求建议 要获
  • 搜索列表列表中一列的最大数字[重复]

    这个问题在这里已经有答案了 我有一份清单 list 1 2 5 2 8 7 3 6 9 我想找到第三列的最大数字 所以我尝试了 zipped zip list print max zipped 2 但它没有显示最大的数字 有人知道原因和解决
  • rpy2 在 debian 上安装问题

    我已经尝试了所有我能想到的在 debian 服务器上安装 RPy2 的安装方法 但无论如何我都收到相同的消息 我已经在我的Mac上成功安装并使用了它 我可能缺少什么吗 start Processing rpy2 Running setup
  • 如何异步返回一个sequelize实例?

    我似乎无法正确通过sequelize对象从service js文件到index js续集变量 有什么地方看起来不合适吗 index js let sequelize let contractModel async gt sequelize
  • PHP-FPM 不写入错误日志

    我刚刚安装了一个 nginx php fpm 服务器 一切看起来都很好 除了 PHP FPM 从不将错误写入其日志 fpm conf default listen var run php fpm default sock listen al
  • 如何使用 F# 发牌

    我一直致力于使用 F 对流行纸牌游戏 情书 进行建模 以了解有关函数式编程的更多信息 module Game open Cards open Players type Deck Card list let dealACard deck De