在 Raku 中,如何编写与 Haskell 函数等价的span函数?
在 Haskell 中,给定一个谓词和一个列表,可以将列表分为两部分:
\n例如,Haskell 表达式 \xe2\x80\xa6
\nspan (< 10) [2, 2, 2, 5, 5, 7, 13, 9, 6, 2, 20, 4]\nRun Code Online (Sandbox Code Playgroud)\n\xe2\x80\xa6 计算为 \xe2\x80\xa6
\n([2,2,2,5,5,7],[13,9,6,2,20,4])\nRun Code Online (Sandbox Code Playgroud)\n如何编写与 Haskell 函数相当的 Raku 函数span?
根据@chenyf的回答,我开发了以下span子例程(后来的额外更新反映了保持忠实于Haskell函数的正逻辑所需的否定谓词)\xe2\x80\xa6spanspan
sub span( &predicate, @numberList )\n {\n my &negatedPredicate = { ! &predicate($^x) …Run Code Online (Sandbox Code Playgroud) 根据Raku 文档,当没有值匹配时,例程first将返回。但是,为什么(下面)Nil行不打印?say ($result === Nil) ;True
sub MAIN()\n {\n my @myNumberList is Array[Int] = [2, 2, 5, 7] ;\n my $result = @myNumberList.first( {$_ > 10} ) ;\n say \'$result\' ;\n say $result ;\n say $result.WHAT ;\n say ($result === Nil) ;\n } # end sub MAIN\nRun Code Online (Sandbox Code Playgroud)\n程序输出为\xe2\x80\xa6
\n$result\n(Any)\n(Any)\nFalse\nRun Code Online (Sandbox Code Playgroud)\n我的目标是确定列表或数组是否包含满足给定谓词的一个或多个元素。在下面的示例程序中,当且仅当给定列表或数组包含至少一个满足对\xe2\x80\xafelems的相应调用中给定谓词的元素时,例程返回一个大于 0 的值。grep
sub MAIN()\n {\n my $myList = (2, 2, …Run Code Online (Sandbox Code Playgroud) 在 Raku 中,给定一个对列表(\xe2\x80\xaf表示 n = 2 \xe2\x80\xaf3 \ xc2\xb7 3 \xe2\x80\xaf2 \xc2\xb7 5 \xe2\x80\xaf1(2 => 3, 3 => 2, 5 => 1, 7 => 4)的质因数分解\xc2\xb7 7 \xe2\x80\xaf4 \xe2\x80\xaf),如何构造\xcf\x83(n) = (\xe2\x80\xaf2 \xe2\x80\xaf0 + 2 \ xe2\x80\xaf1 + 2 \xe2\x80\xaf2 + 2 \xe2\x80\xaf3 \xe2\x80\xaf) \xc2\xb7 (\xe2\x80\xaf3 \ xe2\x80\xaf0 + 3 \xe2\ x80\xaf1 + 3 \xe2\x80\xaf2 \xe2\x80\xaf) \xc2\xb7 (\xe2\x80\xaf5 \xe2\x80\xaf0 + 5 \xe2\x80\xaf1 \xe2\x80\xaf) \xc2\xb7 (\xe2\x80\xaf7 \xe2\x80\xaf0 + 7 \xe2\x80\xaf1 + 7 \xe2\x80\xaf2 + 7 \xe2\x80\xaf3 + …
假设语法 G 有以下产生式 \xe2\x80\xa6
\n使用语法 G,字符串aaaaabb的派生为 \xe2\x80\xa6
\n\n\nS \xe2\x87\x92 aSb \xe2\x87\x92 aaSbb \xe2\x87\x92 aaAbb \xe2\x87\x92 aaaaabb
\n
在如下所示的 Raku 语法中,为什么解析字符串aaaaabb不成功?上面的推导不适用吗?
\n# Goal: language generated by grammar = { a^n b^m : n <= m + 3 }\n# Example string is:\n# aaaaabb = …Run Code Online (Sandbox Code Playgroud) 假设语法 G 有两个产生式 \xe2\x80\xa6
\n在 Raku 中,如何以编程方式(即在运行时动态地)创建这种语法?
\n目标是让 Raku 程序在运行时创建 \xe2\x80\x94 \xe2\x80\x94 一个可以静态编写为 \xe2\x80\xa6 的 Raku 语法
\ngrammar Parser\n {\n token TOP { <S> }\n token S { '' | 'a' <S> 'b' }\n }\nRun Code Online (Sandbox Code Playgroud)\n鉴于我的问题的第一个答案,我正在尝试动态创建静态写为 \xe2\x80\xa6 的内容
\n grammar Parser\n {\n token TOP { <S> }\n } # end grammar Parser\nRun Code Online (Sandbox Code Playgroud)\n我试过 \xe2\x80\xa6
\n constant Parser := Metamodel::GrammarHOW.new_type( name => 'Parser' …Run Code Online (Sandbox Code Playgroud) 在 Raku 中,给定的字符串将被分为其各个字符。每个大写字母字符都应括在尖括号内,每个其他字符应括在单引号内。生成的字符串将连接在一起,并用空格分隔。
\n示例 \xe2\x80\xa6
\naSbTc,则结果字符串将为'a' <S> 'b' <T> 'c'\xe2\x80\xaf。A BxyC$B,则结果字符串将为<A> ' ' <B> 'x' 'y' <C> '$' <B>\xe2\x80\xaf。XY12,则结果字符串将为<X> <Y> '1' '2'\xe2\x80\xaf。sub MAIN ( )\n {\n my $myString = 'aSbTc' ;\n # Desired output: The string "'a' <S> 'b' <T> 'c'" (sans ").\n # Uppercase letters in angle brackets, each other character in single quotes.\n }\n\n …Run Code Online (Sandbox Code Playgroud) 以下Julia程序使用Makie创建如下所示的图像,即“带孔的立方体”。然而,我想消除这些孔,并使立方体更接近实际立方体的形状,只有稍微圆角和边缘。我尝试将指数更改为其他值^2,并将其range直接传递给volume!函数,但无济于事。所需立方体类型的示例可以在CodeSandbox 的three-rounded-box图像中找到。
using Makie, GLMakie\nfig = Figure()\nrange = LinRange(-1, 1, 100) # 100-element LinRange{Float64, Int64}\ncube = [ (x.^2 + y.^2 + z.^2) for x = range, y = range, z = range ] # 100\xc3\x97100\xc3\x97100 Array{Float64, 3}\nax = Axis3( fig[1,1], aspect = :data, azimuth = 1.17 * pi, viewmode = :fit, title = "Cube" )\nvolume!( cube, algorithm = :iso, …Run Code Online (Sandbox Code Playgroud) 以下 Raku 程序定义了一个语法Parser,然后尝试使用它来解析字符串baa。然而,程序执行时间太长。有没有办法限制用于解析的执行时间量,以便解析可以被视为已超出所需的限制并超时\xe2\x80\xaf?
grammar Parser\n {\n token TOP { <S> }\n token S { \'\' | <S> <S> | \'a\' <S> \'b\' | <S> \'a\' | \'b\' <S> \'b\' }\n }\n\nsub MAIN()\n {\n say Parser.parse( \'baa\' ).Bool ; # Would like True, False, or Timeout\n } # end sub MAIN\nRun Code Online (Sandbox Code Playgroud)\n另外,是否有计划让Raku实现ANTLR的自适应 LL(*)解析?ANTLR 4.11.1 版本的代码生成目标包括 Java、Python 等,但不包括 Raku。
\n我希望这个程序314158在执行时编译和打印:
extern crate num;
use num::{BigInt, FromPrimitive, One};
fn main() {
let p: BigInt = FromPrimitive::from_usize(314159).unwrap();
let q: BigInt = p - One::one();
println!("q = {}", q);
} // end main
Run Code Online (Sandbox Code Playgroud)
编译器错误是:
extern crate num;
use num::{BigInt, FromPrimitive, One};
fn main() {
let p: BigInt = FromPrimitive::from_usize(314159).unwrap();
let q: BigInt = p - One::one();
println!("q = {}", q);
} // end main
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个rotate_card接受矢量作为输入的函数,将矢量的前元素旋转到后面,然后返回一个包含旋转元素和旋转产生的矢量的对.
#[derive(Debug)]
enum Card {
Ace,
King,
Queen,
Jack,
}
type Deck = Vec<Card>;
fn rotate_card(deck: &mut Deck) -> (Card, &mut Deck) {
let top_card = deck.remove(0);
deck.push(top_card);
(top_card, deck)
} // end rotate_card
fn main() {
let mut my_deck: Deck = vec![Card::Ace, Card::King, Card::Queen, Card::Jack];
let z: (Card, &mut Deck) = rotate_card(&mut my_deck);
println!("The value of z is: {:?}.", z);
} // end main
Run Code Online (Sandbox Code Playgroud)
error[E0382]: use of moved value: `top_card`
--> src/main.rs:14:6
|
13 | deck.push(top_card);
| …Run Code Online (Sandbox Code Playgroud) 我的目标是让Rust函数f增加一个数组元素x,并增加索引i:
fn main() {
let mut x: [usize; 3] = [1; 3];
let mut i: usize = 1;
f(&mut i, &mut x);
println!("\nWant i = 2, and i = {}", i);
println!("\nWant x = [1,2,1], and x = {:?}", x);
} // end main
fn f(i: &mut usize, x: &mut [usize]) {
x[i] += 1;
i += 1;
} // end f
Run Code Online (Sandbox Code Playgroud)
编译器报告以下错误:
error[E0277]: the trait bound `&mut usize: std::slice::SliceIndex<[usize]>` is not satisfied
--> …Run Code Online (Sandbox Code Playgroud)