我是 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?编译器应该根据之前的 let 赋值知道wolfHallis a Book,因此也知道 a 。Gift
谢谢
在您的代码中,Book意味着两件事:
title和price。Gift。这个特殊情况的类型是Book(记录类型),它被命名为Book。它不必被命名为相同的,但它可以是(并且通常是 - 下一个案例也是如此Chocolate)。所以,你没有铸造wolfHall。您正在构造 的实例Gift,使用特定的 case 构造函数,该构造函数的名称恰好与其包装的类型相同。编译器知道其中的差异,通常当您阅读代码时,您可以分辨出其中的差异。但如果它令人困惑,您当然可以将该构造函数命名为其他名称。