1、之前的验证存在一个漏洞:我们没有说明当输入距离为负数时会发生什么。如果我们认定负距离是无效的(因为英里和码值总是代表铁路网络上的一个物理位置),那么需要对代码做哪些修改来防止负值进入该领域?
要完成这个任务,只需添加几行代码,使用 if 表达式验证 milesPointYards ,然后抛出 ArgumentOutOfRangeException 异常。
2、出于某些目的,英国铁路距离不是用英里和码来表示,而是用英里和链来表示,其中1链定义为22码。编写一个新的类型和模块,该类型和模块可以创建并表示以整英里和链为单位的距离,并将这种以英里和链为单位的距离转换为小数英里。创建新的“英里 - 链”距离的唯一方法应该是提供整英里数和链数输入(即两个正整数),因此与“英里 - 码”不同,不需要 fromMilesPointYards 函数。
要完成此练习,需要创建一个单例判别联合(Single-Case Discriminated Union),类似于 `MilesYards` 判别联合,但以整英里数和链数作为其字段。
由于练习要求只能创建有效的实例,将该判别联合放入一个模块中,并将其用例设为私有。
添加一个 `fromMilesChains` 函数,对整英里数和链数参数进行范围验证,然后使用它们创建一个 `MilesChains` 实例。
为了转换为小数英里,创建一个 `toDecimalMiles` 函数,该函数通过模式匹配来获取整英里数和链数的值,然后使用每英里 80 链的转换因子来计算小数英里。
3、在F#中,有一个BillingDetails类型和如下形式的一些订单:type BillingDetails = { Name : string; Billing : string; Delivery : string option }; let myOrder = { Name = “Kit Eason”; Billing = “112 Fibonacci StreetErehwon35813”; Delivery = None }; let hisOrder = { Name = “John Doe”; Billing = “314 Pi AvenueErehwon15926”; Delivery = None }; let herOrder = { Name = “Jane Smith”; Billing = null; Delivery = None }; let orders = [| myOrder; hisOrder; herOrder |]。请写出最简洁的函数,用于计算具有非空账单地址的BillingDetails实例的数量(忽略送货地址)。
可以使用以下F#代码实现:
orders
|> Seq.map (fun order -> Option.ofObj order.Billing)
|> Seq.filter Option.isSome
|> Seq.length
4、抽取20套房屋样本,对于每套房屋,生成一个格式为“地址: 1 Stochastic Street - 价格: 123456.00000”的字符串。价格显示的小数位数无关紧要。
首先绑定一个名为 housePrices 的值,接着使用 House 模块中的 getRandom 函数获取20套房屋的样本。由于这是一个多对多的操作,可选择合适的集合函数(如 map 、 mapi 、 sort 、 sortBy 和 rev )来生成所需的字符串。
5、抽取20套房屋样本并计算它们价格的平均值。你可以假设列表不为空(你知道它有20套房屋!)
let averagePrice = House.getRandom 20 |> Array.averageBy (fun h -> h.Price)
6、抽取20套房屋样本,找出所有价格超过25万美元的房屋。
可以使用集合函数来解决此问题。示例代码如下:
House.getRandom 20 |> Array.filter (fun h -> h.Price > 250_000m)
此代码通过 House.getRandom 函数获取20套房屋样本,然后使用 Array.filter 函数过滤出价格超过25万美元的房屋。
7、抽取20个房屋样本,返回一个元组数组,每个元组包含一个房屋和到最近学校的距离。使用 Distance.tryToSchool 函数计算距离。排除该函数返回 None 的房屋。
可以使用以下代码实现:
House.getRandom 20
|> Array.choos

最低0.47元/天 解锁文章
1654

被折叠的 条评论
为什么被折叠?



