Как я могу рассматривать тип, который по сути является кортежем, как кортеж в F # - PullRequest
4 голосов
/ 10 марта 2011

Хорошо, скажем, у меня есть тип, определенный следующим образом:

type Foo = 
    | Bar of (SomeType * SomeType * SomeType * SomeType)
    | ...(other defs)

, поэтому у меня есть Bar, который в основном является кортежем из 4 SomeTypes.Я хочу получить доступ к отдельным членам кортежа.Я попробовал это:

let Bar (один, два, три, четыре) = someBar

Но когда я пытаюсь сослаться на один или два позже в функции, он говорит, что «Значение или конструктор не определены "Так что это не относится к назначению как ожидалось.Как правильно это сделать?

Кроме того, если я попытаюсь:

let one,two,three,four = someBar

Он жалуется: ожидается, что someBar будет иметь тип 'a *' b * 'c *' d, но здесь имеет тип Foo

спасибо,

Ответы [ 2 ]

6 голосов
/ 10 марта 2011

Вам просто нужно добавить еще один набор скобок:

let (Bar(one,two,three,four)) = someBar

Как отмечает Стивен, без дополнительных символов компилятор обрабатывает эту строку кода как определение новой функции с именем Bar.Он также прав, что сопоставление с образцом, вероятно, было бы более уместным, если бы в дискриминационном объединении были другие случаи.

1 голос
/ 10 марта 2011

С учетом

type Foo = 
    | Bar of (int * int * int * int)
    | Bar2 of string

let x = Bar(1,2,3,4)

let Bar(y1,y2,y3,y4) = x

последняя привязка let интерпретируется как функция, Bar : 'a * 'b * 'c * 'd -> Foo. Имя функции сбивает вас с толку, так как оно совпадает с регистром объединения, но так же, как если бы вы определили let some_func_takes_a_tuple_and_returns_x (y1,y2,y3,y4) = x.

Я думаю, вам, возможно, придется быть немного более многословным:

let y1,y2,y3,y4 =
    match x with
    | Bar(y1,y2,y3,y4) -> y1,y2,y3,y4

Что достаточно справедливо, поскольку в отличие от декомпозиции кортежей, позволяющей привязывать, декомпозиция Bar здесь опасна, поскольку совпадение неполное (x на самом деле может быть другим * Foo случаем, таким как Bar2).

Редактировать

@ kvb знает секрет, как сделать эту работу, как вы ожидаете!

...