Сопоставление с образцом Rust по вектору

В учебном пособии показаны некоторые очень простые примеры сопоставления с образцом, например сопоставление по целому числу для имитации оператора 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

Итак, глядя на приблизительный перевод, было бы неплохо иметь возможность сделать:

fn foldr(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

В учебнике есть пример деструктуризации структур (определенных с помощью {..} ) и кортежей (определенных с помощью (..) ) , поэтому похоже, что должна быть встроенная поддержка векторов, учитывая, что они также содержат специальный синтаксис (определенный с помощью [..] ).

Не стесняйтесь поправлять меня, если я тоже неправильно использую векторы.

12
задан tshepang 20 April 2015 в 23:15
поделиться