最近我需要比较两组历史数据.由于其中一个中有时缺少一两天而我想要精确,我决定创建一个包含所有可能日期的列表和两个包含日期和属于两个集合的相应值的元组列表.然后我将后面的列表更改为Map
s以改进日期查找.
我们的想法是尝试在两个列表中找到完整日期列表中的每个日期,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) 我不明白为什么以下练习在第一原理的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的新手,所以起初我认为这是因为在s1
Haskell中隐含地让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) 我想在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). …
在寻找可用的方法时,Vec<T>
我偶然发现了
into_boxed_slice(self) -> Box<[T]>
Run Code Online (Sandbox Code Playgroud)
String
也有这样的方法(into_boxed_str(self)
)。拥有Deref
for Vec<T>
/ String
使其可以像共享分片(&[T]
)那样对待的好处是显而易见的,但是Box<[T]>
除了FFI之外,我看不到拥有分片()的任何用途。Rust GitHub存储库仅into_boxed_slice()
在少数情况下使用。
由于可以使用创建盒装切片的方法,std
并且该容器在其主页上列出,因此我认为我可能会缺少一些有用的东西。在哪些情况下我应该使用所有权切片来支持a Vec<T>
或a String
?
这个功能有没有实现?
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) 大家晚上好,我是哈斯凯尔的新手.我试图总结一个读取字符串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) 我最近在 crates.io 上发布了我的第一个 crate,我想知道是否可以以更简单的方式维护其文档。
很多板条箱的文档都托管在 GitHub 页面上,所以我想我应该尝试一下。我创建了一个 user.github.io 存储库,生成文档cargo doc
并将其推送到其中。一切工作正常,可以从 crates.io 查看文档。
但更新不方便;如果我修改板条箱的文档,我需要:
cargo doc
我很确定我做得不对 - 尤其是第 3 点。我可以做些什么来简化这个过程?还有更好的办法吗?
我今年将尝试在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)
我不能同时具有对HashMap
(self.processes
)和可变变量的引用,也不能具有两个可变引用。
那么,在Rust中最惯用的方法是什么?我可以看到两个选项:
还有第三种选择吗?
让我们想象我有这个课程:
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
元素,我要乘perCent
的rate
,总结所有的结果.
我想在Java 8中使用lambda表达式.我想使用这样的东西:
moneyBorrowed.stream().forEach(p -> {
p.getPerCent() * p.getRate()
}).sum();
Run Code Online (Sandbox Code Playgroud)
但我运气不好......
有什么建议吗?
我有一个带有实现的结构,该实现具有访问结构的私有状态的函数.
struct Example {...}
impl Example {
fn test(&self) -> .. {...}
}
Run Code Online (Sandbox Code Playgroud)
在另一个模块中的其他地方存在另一个特征:
trait ExampleTrait {
fn test(&self) -> .. {...}
}
Run Code Online (Sandbox Code Playgroud)
现在我想实现ExampleTrait
的Example
结构和测试方法转发到测试impl
的结构.
以下代码:
impl ExampleTrait for Example {
fn test(&self) -> .. {
self.test()
}
}
Run Code Online (Sandbox Code Playgroud)
显然是一个无限的递归调用.我不能只重复原始测试的主体,因为我无法访问Example
此处的私有状态.
有没有其他方法可以做到这一点,除了重命名一个功能或在Example
公共场所制作字段?
rust ×5
haskell ×4
boxing ×1
containers ×1
currying ×1
function ×1
github-pages ×1
java ×1
java-8 ×1
lambda ×1
list ×1
performance ×1
private ×1
rust-cargo ×1
rustdoc ×1
slice ×1
traits ×1
types ×1