F# 为什么需要强制转换?

Moe*_*ald 1 f#

我是 F# 新手,正在阅读本文。本文提供了以下递归类型的示例:

type Book = {title: string; price: decimal}

type ChocolateType = Dark | Milk | SeventyPercent
type Chocolate = {chocType: ChocolateType ; price: decimal}

type WrappingPaperStyle =
    | HappyBirthday
    | HappyHolidays
    | SolidColor

type Gift =
    | Book of Book
    | Chocolate of Chocolate
    | Wrapped of Gift * WrappingPaperStyle
    | Boxed of Gift
    | WithACard of Gift * message:string

Run Code Online (Sandbox Code Playgroud)

它的使用方式如下:

let wolfHall = {title="Wolf Hall"; price=20m}

let birthdayPresent = WithACard (Wrapped (Book wolfHall, HappyBirthday), "Happy Birthday")
Run Code Online (Sandbox Code Playgroud)

我不明白的是:为什么我需要转换wolfHall为 a Book?编译器应该根据之前的 le​​t 赋值知道wolfHallis a Book,因此也知道 a 。Gift

谢谢

Jim*_*oye 5

在您的代码中,Book意味着两件事:

  1. 它是具有两个字段的记录类型的名称,titleprice
  2. 这是受歧视工会的案例之一Gift。这个特殊情况的类型是Book(记录类型),它被命名为Book。它不必被命名为相同的,但它可以是(并且通常是 - 下一个案例也是如此Chocolate)。

所以,你没有铸造wolfHall。您正在构造 的实例Gift,使用特定的 case 构造函数,该构造函数的名称恰好与其包装的类型相同。编译器知道其中的差异,通常当您阅读代码时,您可以分辨出其中的差异。但如果它令人困惑,您当然可以将该构造函数命名为其他名称。