Я новичок в 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
Который используется следующим образом:
let wolfHall = {title = "Wolf Hall"; price=20m}
let birthdayPresent = WithACard (Wrapped (Book wolfHall, HappyBirthday), "Happy Birthday")
Чего я не понимаю: зачем мне приводить wolfHall
к Book
? Компилятор должен знать, что wolfHall
— это Book
и, следовательно, Gift
, основываясь на предварительном присвоении let.
Спасибо
В вашем коде Book
означает две вещи:
title
и price
.Gift
. Этот конкретный случай имеет тип Book
(тип записи) и называется Book
. Это не обязательно должно называться так же, но может быть (и часто так — то же самое верно и для следующего случая, Chocolate
).Значит, ты не кастинг wolfHall
. Вы создаете экземпляр Gift
, используя конкретный конструктор case, имя которого совпадает с типом, который он обертывает. Компилятор знает разницу, и обычно, когда вы читаете код, вы можете заметить разницу. Но если это сбивает с толку, вы, безусловно, можете назвать этот конструктор как-то иначе.
Это не актерский состав. Он создает значение типа
Gift
, вызывая один из пяти конструкторов с именемBook
. У него то же имя, что и у типаBook
, но это не одно и то же.