Все это работает для меня. Это ваш синтаксис соответствия, который чаще всего вы найдете его в операторах соответствия, но он находится на левой стороне задания. Возможно, изначально это имеет наибольший смысл для кортежей, но вы можете использовать это с любой структурой.
let (a,b) = (1,2)
let (x,_) = (4,5)
Еще две интересные вещи, которые стоит попробовать:
let (head::tail) = [1;2;3;4]
FSI отвечает предупреждением FS0025: В этом выражении совпадает неполный шаблон. Например, значение «[]» может указывать на случай, не охватываемый шаблоном (ами).
«Это правда», - рассуждаете вы вслух. «Я должен выразить это как совпадение и включить пустой список как возможность». Лучше превратить такие предупреждения в полностью достоверные ошибки (см .: предупреждать как ошибку, например, --warnaserror +: 25). Не игнорируйте их. Разрешите их по привычке или с помощью метода компилятора. В одном случае нет двусмысленности, так что продолжайте писать код.
Более полезным и интересным является синтаксис соответствия на l.h.s. назначения функции. Это круто. Для содержательных функций вы можете распаковать содержимое внутри, а затем выполнить операцию с внутренними компонентами за один шаг.
let f (Composite(x,y)) = sprintf "Composite(%i,%s)" x y
f (Composite(1,"one"))
> val it : string = "Composite(1,one)"
О вашем коде:
type Address = Address of string //using unwrapping function like
let unwrapAddress (Address a) = a
let addr = Address "sdf"
let str = unwrapAddress addr
type Composite = Composite of integer:int * someStr:string
let unwrap (Composite(c,_)) = c
let cval = Composite(1,"blah")
unwrap cval
Обходной путь:
let xy = Composite(1,"abc") |> function (Composite(x,y))->(x,y)
... но более приятный способ, если вы хотите сохранить именованные элементы своего единственного случая DU, будет ...
let (|Composite|) = function | Composite(x,y)->(x,y)
let unwrap (Composite(x)) = x
let unwrap2 (Composite(x,y)) = (x,y)
... не строго декомпозиция через единичный случай DU, а декомпозиция через единичный случай Активный шаблон
наконец, вы можете присоединить метод к структуре Composite ...
module Composite =
let unwrap = function | Composite(x,y)->(x,y)
Одно из лучших обсуждений использования этой техники - здесь
Также обратите внимание на сигнатуру, которую дает нам развёртка: функция, которая принимает Composite (выделено курсивом) и возвращает int (выделено жирным шрифтом).
Подпись - val unwrap: Composite -> int
person
sgtz
schedule
15.06.2017
let unwrap (Composite (i, s)) = i, s
- person FoggyFinder   schedule 15.06.2017