小编lje*_*drz的帖子

使用Haskell打印菱形图案

我需要编写一个Haskell程序,它将以递归方式生成菱形输出.以下是给定输入的一些示例输出

输入:1
输出:

 *
* *
 *
Run Code Online (Sandbox Code Playgroud)

输入:2
输出:

    *
   * *
    *
 *     *
* *   * *
 *     *
    *
   * *
    *
Run Code Online (Sandbox Code Playgroud)

输入:3
输出:

             *             
            * *             
             *              
          *     *           
         * *   * *          
          *     *           
             *              
            * *             
             *              

    *                 *    
   * *               * *   
    *                 *    
 *     *           *     * 
* *   * *         * *   * *
 *     *           *     * 
    *                 *    
   * *               * *   
    *                 *    
             *             
            * *             
             *              
          * …
Run Code Online (Sandbox Code Playgroud)

io recursion haskell

5
推荐指数
2
解决办法
1027
查看次数

如果String可以在stdout中立即报告,它是一个有效的错误类型吗?

我最近实现了国际象棋游戏的基本机制,并将该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)

游戏在终端中播放,可以立即报告任何输入错误.在这种情况下引入自定义错误类型是否有任何附加价值?

error-handling rust

5
推荐指数
1
解决办法
595
查看次数

通过FFI在C和Haskell之间传递类似结构的数据

考虑一个看起来像这样的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等.但对于更复杂的类型,我不知道该怎么做.

c haskell ffi

5
推荐指数
1
解决办法
253
查看次数

使用From类型为结构实现PartialEq

我试图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)

struct traits rust

5
推荐指数
2
解决办法
385
查看次数

如何在未排序数组或其段中找到第 k 个最小元素?

Rust 是否具有在数组或数组段中查找第k个最小元素的函数?

(类似于std::nth_element在 C++ 中)

arrays rust

5
推荐指数
1
解决办法
307
查看次数

Rust 中的单链表

我最近一直在尝试自学一些 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)

linked-list rust

5
推荐指数
1
解决办法
5658
查看次数

#[inline] 可以在特征方法声明和实现中使用吗?

我有一些小方法的特征,这些方法通常作为实现结构所具有的其他方法的单行包装器来实现。如果我想确保特征方法是内联的,我应该放置#[inline(always)]在特征定义内部,还是放在impl每个结构内部?我更愿意简单地将其放入特征定义中,但据我所知,这是行不通的。

traits rust

5
推荐指数
1
解决办法
3140
查看次数

如何增加 Rust 库可用的堆栈大小?

我正在使用 lambda 演算,并且希望有更多的堆栈空间,以便能够构建和计算(非常)长的函数链。有没有办法增加板条箱的它,类似于增加递归限制(#![recursion_limit = "100"])?

该板条箱是一个库,我希望它能够执行堆栈密集型操作,无论目标操作系统如何。

stack os-agnostic rust

5
推荐指数
1
解决办法
6431
查看次数

为什么 &amp;[T] 参数也接受 &amp;Vec&lt;T&gt;?

我正在研究 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]

types vector rust

5
推荐指数
1
解决办法
1205
查看次数

Rust的Peano数字

我想在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,而是用structs和PhantomData(例1,例2). …

functional-programming rust peano-numbers

4
推荐指数
1
解决办法
213
查看次数