小编lje*_*drz的帖子

何时应该使用Haskell的Data.Map来支持元组列表?

最近我需要比较两组历史数据.由于其中一个中有时缺少一两天而我想要精确,我决定创建一个包含所有可能日期的列表和两个包含日期和属于两个集合的相应值的元组列表.然后我将后面的列表更改为Maps以改进日期查找.

我们的想法是尝试在两个列表中找到完整日期列表中的每个日期,Map并创建一个"三元组"列表,(date, value1, value2)其中仅包含两个数据集都有日期和值的日期.然后我可以将它们写入文件并正确地比较它们.

请不要仔细阅读代码,仅包括良好的测量方法

这是代码(它根本不是最优的,但对于那个小任务,它很好地完成了它的工作):

import qualified Data.Map as M
import Data.List (transpose)
import Data.Maybe (fromJust)

main = do
    dts     <- readFile "dates.txt"
    cts1    <- readFile "eu.txt"
    cts2    <- readFile "usa.txt"
    let
        dates  = lines dts
        cols1  = transpose $ map words $ lines cts1
        cols2  = transpose $ map words $ lines cts2
        prs1   = zip (head cols1) (last cols1)
        prs2   = zip (head cols2) (last cols2)
        map1   = M.fromList prs1
        map2 …
Run Code Online (Sandbox Code Playgroud)

performance haskell

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

部分应用数据构造函数

我不明白为什么以下练习在第一原理的Haskell编程中 "有效" :

type Subject = String
type Verb = String
type Object = String

data Sentence =
    Sentence Subject Verb Object
    deriving (Eq, Show)

s1 = Sentence "dogs" "drool"
s2 = Sentence "Julie" "loves" "dogs"
Run Code Online (Sandbox Code Playgroud)

将其加载到ghci中表明它可以很好地解决问题,但为什么定义s1甚至有意义呢?我仍然是Haskell的新手,所以起初我认为这是因为在s1Haskell中隐含地让Object字符串为空.但是之后...

*Main> s1

<interactive>:13:1:
    No instance for (Show (Object -> Sentence))
      arising from a use of `print'
    Possible fix:
      add an instance declaration for (Show (Object -> Sentence))
    In a stmt of an interactive GHCi command: print …
Run Code Online (Sandbox Code Playgroud)

haskell currying partial-application

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

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
查看次数

into_boxed_slice()方法有什么用?

在寻找可用的方法时,Vec<T>我偶然发现了

into_boxed_slice(self) -> Box<[T]>
Run Code Online (Sandbox Code Playgroud)

String也有这样的方法(into_boxed_str(self))。拥有Dereffor Vec<T>/ String使其可以像共享分片(&[T])那样对待的好处是显而易见的,但是Box<[T]>除了FFI之外,我看不到拥有分片()的任何用途。Rust GitHub存储库仅into_boxed_slice()在少数情况下使用。

由于可以使用创建盒装切片的方法,std并且该容器在其主页上列出,因此我认为我可能会缺少一些有用的东西。在哪些情况下我应该使用所有权切片来支持a Vec<T>或a String

containers boxing types slice rust

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

这个功能可以实现吗?

这个功能有没有实现?

foo :: (Monad m, Monad n) => m a -> n a -> (a -> a -> a) -> m (n a)
foo x y f = ...
Run Code Online (Sandbox Code Playgroud)

haskell function

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

如何避免"异常:Prelude.head:空列表"? - 哈斯克尔

大家晚上好,我是哈斯凯尔的新手.我试图总结一个读取字符串Unicode值的列表,并将它们存储在一个列表中,然后将整数加起来.

 getLetterUnicodeValue :: Char -> Int
 getLetterUnicodeValue l = (ord l) - 64

 unicodeValueList :: String -> [Int]
 unicodeValueList x = getLetterUnicodeValue (head x) : unicodeValueList (tail x)

 total :: [Int] -> Int
 total []     = 0
 total x = (head x) + (total (tail x))
Run Code Online (Sandbox Code Playgroud)

当字符串到达​​最后一个字符并且总结功能无法成功执行时,我得到了空列表的错误.有什么办法可以在功能unicodeValueList结束时停止它.

*** Exception: Prelude.head: empty list
Run Code Online (Sandbox Code Playgroud)

haskell list

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

如何方便地托管 crate 的最新文档?

我最近在 crates.io 上发布了我的第一个 crate,我想知道是否可以以更简单的方式维护其文档。

很多板条箱的文档都托管在 GitHub 页面上,所以我想我应该尝试一下。我创建了一个 user.github.io 存储库,生成文档cargo doc并将其推送到其中。一切工作正常,可以从 crates.io 查看文档。

但更新不方便;如果我修改板条箱的文档,我需要:

  1. 将这些更改推送到板条箱的存储库中
  2. 通过生成更新的文档cargo doc
  3. 将文档文件移动到 GitHub 页面的文件夹
  4. 将文档推送到文档的存储库

我很确定我做得不对 - 尤其是第 3 点。我可以做些什么来简化这个过程?还有更好的办法吗?

documentation rust github-pages rust-cargo rustdoc

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

如何同时遍历Rust HashMap并修改其某些值?

我今年将尝试在Rust中使用Code Advent,作为学习语言的一种方式。我已经将输入(从第7天开始)解析为以下结构:

struct Process {
    name: String,
    weight: u32,
    children: Vec<String>,
    parent: Option<String>
}
Run Code Online (Sandbox Code Playgroud)

这些存储在中HashMap<String, Process>。现在,我要根据在父级的“子级”向量中找到的内容,迭代地图中的值并更新父级值。

什么是行不通的

for p in self.processes.values() {
    for child_name in p.children {
        let mut child = self.processes.get_mut(child_name).expect("Child not found.");
        child.parent = p.name;
    }
}
Run Code Online (Sandbox Code Playgroud)

我不能同时具有对HashMapself.processes)和可变变量的引用,也不能具有两个可变引用。

那么,在Rust中最惯用的方法是什么?我可以看到两个选项:

  1. 在不可变引用超出范围后,一次将父/子关系复制到新的临时数据结构中,然后在第二次更新中更新Process结构。
  2. 更改我的数据结构以将“父”放入其自己的HashMap中。

还有第三种选择吗?

rust borrow-checker

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

使用lambda的复杂对象列表中的多个操作

让我们想象我有这个课程:

public class Borrow {
   private Float perCent;
   private Float rate;
}
Run Code Online (Sandbox Code Playgroud)

我有一个Borrow对象列表:

List<Borrow> moneyBorrowed = new ArrayList<Borrow>();
Run Code Online (Sandbox Code Playgroud)

对于每一个Borrow元素,我要乘perCentrate,总结所有的结果.

我想在Java 8中使用lambda表达式.我想使用这样的东西:

    moneyBorrowed.stream().forEach(p -> {
        p.getPerCent() * p.getRate()
    }).sum();
Run Code Online (Sandbox Code Playgroud)

但我运气不好......

有什么建议吗?

java lambda java-8

4
推荐指数
2
解决办法
88
查看次数

如何在实现特征时避免函数名称冲突?

我有一个带有实现的结构,该实现具有访问结构的私有状态的函数.

struct Example {...}

impl Example {
    fn test(&self) -> .. {...}
}
Run Code Online (Sandbox Code Playgroud)

在另一个模块中的其他地方存在另一个特征:

trait ExampleTrait {
    fn test(&self) -> .. {...}
}
Run Code Online (Sandbox Code Playgroud)

现在我想实现ExampleTraitExample结构和测试方法转发到测试impl的结构.

以下代码:

impl ExampleTrait for Example {
    fn test(&self) -> .. {
        self.test()
    }
}
Run Code Online (Sandbox Code Playgroud)

显然是一个无限的递归调用.我不能只重复原始测试的主体,因为我无法访问Example此处的私有状态.

有没有其他方法可以做到这一点,除了重命名一个功能或在Example公共场所制作字段?

private traits rust

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