В учебнике показаны некоторые очень простые примеры сопоставления с образцом, такие как сопоставление по целому числу для эмуляции оператора switch в стиле c.Учебное пособие также показывает, как выполнить базовую деструктуризацию по типу кортежа и деструктурирующие структуры.
Кажется, что должно быть возможно сопоставить шаблон по вектору, но я не могу понять правильный синтаксис для него, и у меня нетНе найдено ни одного примера.
Например, в Haskell вы можете легко деструктурировать список:
foldr :: (a -> b -> b) -> b -> [a] -> b
foldr func initValue [] = initValue
foldr func initValue (x:xs) = func initValue $ foldr initValue func xs
Так что, глядя на грубый перевод, было бы неплохо иметь возможностьto do:
fn foldr<A, B>(func: fn(A, B) -> B,
initValue: B,
vals: [A]) -> B {
alt vals {
[] { ret initValue; }
_ {
let h = vec::head(vals),
t = vec::tail(vals);
ret foldr(func, func(initValue, h), t);
}
}
}
Примечание: я знаю, что вы могли бы использовать здесь выражение if, я просто использую это как пример сопоставления с шаблоном по вектору.
В настоящее время это возвращает:
patterns.rs:10:4: 10:5 error: constant contains unimplemented expression type
patterns.rs:10 [] { ret initValue; }
^
error: aborting due to previous errors
В учебном пособии есть пример для структур деструктурирования (определен с { .. }
) и кортежей (определен с ( .. )
), так что кажется, что должны быть построеныв поддержку векторов, а также учитывая, что они также содержат специальный синтаксис (определенный с помощью [ .. ]
).
Не стесняйтесь исправлять меня, если я также использую векторы неправильно.