将ghci通过劣质haskell模式与Emacs集成是非常好的:这为快速导航到编译错误位置,交互式检查类型,定义等提供了很好的可能性.然而,我在此设置中缺少的主要功能是无法使用ghci tab-completion,这对于完成导入的模块,语言扩展和ghci命令可用的功能非常有用.
我假设通过将原始"TAB"字符传递给ghci进程,读取其输出并将结果粘贴到Emacs缓冲区中,可以相当简单地实现此功能.请注意,我没有在Emacs中使用"comint-mode",所以我可能完全错了.
最后,我们提出了一个问题:为什么haskell模式缺少此功能?是否有任何我不知道的明显问题,难以实施,还是仅仅是由于某些历史原因?(比如"没有人费心去写它").你有问题的解决方法吗?(除了在Emacs外面运行ghci)
我正在阅读Rust书籍,并尝试了解PartialEqand Eq特质的用例。
我认识到,PartialEq是关系其不必是反射性(也就是说,可这样x说x != x),而且Eq是一个标记性状它说,关系也是自反(现在是一个合适的等价关系)。
这些书提供了一个示例,其中PartialEq还不够,而且Eq还需要:HashMap<K, V>查找。的确,如果将仅实现的数据类型用作键PartialEq(例如浮点数),则在尝试NaN用作键时会遇到麻烦,因为我们无法找到它。
现在,我试图了解查找需要什么功能Eq。如果找到不需要的代码示例,我也许可以更好地理解它Eq。
该书说,这样做assert_eq!仅是PartialEq为了使我们能够比较事物是否平等。但是,如果我们编写assert_eq!(f64::NAN, some_code_producing_nan());测试,则测试将始终失败。与在中使用PartialEq键存在相同的基本问题HashMap,但由于某些原因,在此认为它是适当的。
什么是仅需要PartialEq 且添加Eq不理想/ 不合理的合理功能的示例?
如果没有这样的使用情况,那我们为什么关心分裂成两个特点PartialEq/ Eq?以Haskell为例Eq。
举个例子,考虑一下琐碎的功能
f :: (Integral b) => a -> b
f x = 3 :: Int
Run Code Online (Sandbox Code Playgroud)
GHC抱怨它不能推断(b~Int).该定义匹配签名,因为它返回的是Integral(即Int).为什么GHC会强迫我使用更具体的类型签名?
谢谢
我如何说服 Rust 编译器内部match表达式在这里没问题,因为外部match已经限制了可能的类型?
enum Op {
LoadX,
LoadY,
Add,
}
fn test(o: Op) {
match o {
Op::LoadX | Op::LoadY => {
// do something common with them for code reuse:
print!("Loading ");
// do something specific to each case:
match o {
// now I know that `o` can only be LoadX | LoadY,
// but how to persuade the compiler?
Op::LoadX => print!("x"), /* LoadX specific */
Op::LoadY => print!("y"), /* LoadY specific */ …Run Code Online (Sandbox Code Playgroud) 我想知道如何在宏下使用条件编译模块cfg!。我正在尝试这个:
pub fn f() { ... }
#[cfg(feature = "x")]
pub mod xmodule {
pub fn f() { ... }
}
pub fn test() {
if cfg!(feature = "x") {
xmodule::f();
} else {
f();
};
}
Run Code Online (Sandbox Code Playgroud)
当我使用 编译它时它工作正常cargo check --features x,但如果我不启用该功能,它会失败并出现以下错误:
use of undeclared type or module `xmodule`
Run Code Online (Sandbox Code Playgroud)
我是否做错了什么,或者编译不够智能,无法理解如果未设置该功能则不应使用该模块?