我需要编写一个Haskell程序,它将以递归方式生成菱形输出.以下是给定输入的一些示例输出
输入:1
输出:
*
* *
*
Run Code Online (Sandbox Code Playgroud)
输入:2
输出:
*
* *
*
* *
* * * *
* *
*
* *
*
Run Code Online (Sandbox Code Playgroud)
输入:3
输出:
*
* *
*
* *
* * * *
* *
*
* *
*
* *
* * * *
* *
* * * *
* * * * * * * *
* * * *
* *
* * * *
* *
*
* *
*
* …
Run Code Online (Sandbox Code Playgroud) 我最近实现了国际象棋游戏的基本机制,并将该Result<T, E>
类型用于收集人类输入的方法,因为它可能无效.但是,我不确定我应该选择哪种类型的可能错误(E
).
我认为在构建图书馆时,引入新类型被认为是一种很好的做法.但是,当Result
可以立即处理并且Err
在stdout中报告时,仅仅返回Result<T, String>
s或Result<T, &str>
s(或者Result<T, Cow<str>>
如果两者都可以发生则更简单)是不是更简单?
考虑以下情况:
pub fn play() {
let mut game = Game::new();
loop {
match game.turn() {
Ok(()) => { game.turn += 1 }
Err(e) => println!("{}", e)
}
}
}
Run Code Online (Sandbox Code Playgroud)
游戏在终端中播放,可以立即报告任何输入错误.在这种情况下引入自定义错误类型是否有任何附加价值?
考虑一个看起来像这样的Haskell数据类型
data MyData = MyData { arrInt :: [Int] , arrDouble :: [Double], arraySize :: N }
Run Code Online (Sandbox Code Playgroud)
这里N表示MyData记录的两个数组的大小.
是否可以将此(或MyData对象的某种Haskell"指针")传递给看起来像这样的C函数.
int myfunc (int* a, double* b, int N)
Run Code Online (Sandbox Code Playgroud)
我能够使用FFI来调用接受和返回简单数据类型的C函数,如Double,Int,Char等.但对于更复杂的类型,我不知道该怎么做.
我试图PartialEq
在我创建的结构和我的结构实现From
特征的其他类型之间实现.真正的代码更复杂,并且From
适用于其他类型,但这是核心问题的精简版本.
我希望能够做到:
let s = Data::from(5);
assert_eq!(5, s);
Run Code Online (Sandbox Code Playgroud)
这是基本代码:
struct Data {
data: i64,
}
impl From<i64> for Data {
fn from(v: i64) -> Data {
Data { data: v }
}
}
impl<'a> From<&'a i64> for Data {
fn from(v: &'a i64) -> Data {
Data { data: v.clone() }
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的第一次尝试:
impl<T> PartialEq<T> for Data
where T: Into<Data>
{
fn eq(&self, other: &T) -> bool {
let o = Data::from(other);
self.data …
Run Code Online (Sandbox Code Playgroud) Rust 是否具有在数组或数组段中查找第k个最小元素的函数?
(类似于std::nth_element
在 C++ 中)
我最近一直在尝试自学一些 Rust,并想通过实现一个简单的链表来练习一下。我从 Rust 库的链表中获得了一些灵感,并尝试复制我已经理解的部分。此外,我决定暂时将其设为单链接。
struct Node<T> {
element: T,
next: Option<Box<Node<T>>>,
}
impl<T> Node<T> {
fn new(element: T) -> Self {
Node {
element: element,
next: None,
}
}
fn append(&mut self, element: Box<Node<T>>) {
self.next = Some(element);
}
}
pub struct LinkedList<T> {
head: Option<Box<Node<T>>>,
tail: Option<Box<Node<T>>>,
len: u32,
}
impl<T> LinkedList<T> {
pub fn new() -> Self {
head: None,
tail: None,
len: 0,
}
pub fn push(&mut self, element: T) {
let node: Box<Node<T>> = Box::new(Node::new(element));
match …
Run Code Online (Sandbox Code Playgroud) 我有一些小方法的特征,这些方法通常作为实现结构所具有的其他方法的单行包装器来实现。如果我想确保特征方法是内联的,我应该放置#[inline(always)]
在特征定义内部,还是放在impl
每个结构内部?我更愿意简单地将其放入特征定义中,但据我所知,这是行不通的。
我正在使用 lambda 演算,并且希望有更多的堆栈空间,以便能够构建和计算(非常)长的函数链。有没有办法增加板条箱的它,类似于增加递归限制(#![recursion_limit = "100"]
)?
该板条箱是一个库,我希望它能够执行堆栈密集型操作,无论目标操作系统如何。
我正在研究 Rust 书,即minigrep 项目。在那里我遇到了以下片段:
fn main() {
let args: Vec<String> = env::args().collect();
let (query, filename) = parse_config(&args);
// --snip--
}
fn parse_config(args: &[String]) -> (&str, &str) {
let query = &args[1];
let filename = &args[2];
(query, filename)
}
Run Code Online (Sandbox Code Playgroud)
对我来说最令人困惑的是args: &[String]
。如果我将其替换为args: &Vec<String>
,它也可以工作。我的猜测是,这&[String]
是一个更通用的类型注释,不仅匹配&Vec<String>
,还匹配其他一些类型。那是对的吗?如果是这样, 还可以匹配哪些其他类型[T]
?
我想在Rust中编写一个简单的Peano数字实现,似乎我设法让基础知识工作:
use self::Peano::*;
use std::ops::Add;
#[derive(Debug, PartialEq)]
enum Peano {
Zero,
Succ(Box<Peano>)
}
impl Add for Peano {
type Output = Peano;
fn add(self, other: Peano) -> Peano {
match other {
Zero => self,
Succ(x) => Succ(Box::new(self + *x))
}
}
}
fn main() {
assert_eq!(Zero + Zero, Zero);
assert_eq!(Succ(Box::new(Zero)) + Zero, Succ(Box::new(Zero)));
assert_eq!(Zero + Succ(Box::new(Zero)), Succ(Box::new(Zero)));
assert_eq!(Succ(Box::new(Zero)) + Succ(Box::new(Zero)), Succ(Box::new(Succ(Box::new(Zero)))));
assert_eq!(Succ(Box::new(Zero)) + Zero + Succ(Box::new(Zero)), Succ(Box::new(Succ(Box::new(Zero)))));
}
Run Code Online (Sandbox Code Playgroud)
然而,当我决定看看其他人是如何实现的时候,我看到没有人决定用a来做enum
,而是用struct
s和PhantomData
(例1,例2). …