小编Xco*_*e23的帖子

为什么 Rust 需要包和工作区?

我对 Rust 模块层次结构中三个上层的存在以及为什么需要它们感到有点困惑。如果我理解正确的话:

  • 板条箱是包含多个模块的简单项目,每个板条箱要么是一个库,要么是一个二进制文件。
  • 软件包包含一个或多个 crate,最多包含一个库。
  • 工作区是一组包。

我知道如果一起开发多个板条箱,则需要将它们放在一起,因此包或工作区对我来说都有意义,但我不明白为什么两者都需要存在以及为什么最多需要 1 个库限制在包裹上。这样做有什么好处呢?

我已阅读为什么 Cargo 包只能有一个库目标?这解释了每个包 1 个库箱的规则,但这让我更加困惑,因为你仍然可以拥有带有二进制文件的包,甚至“更糟糕”没有库。如果包是包管理器 Cargo 的抽象,为什么要允许其中包含二进制文件呢?为什么允许内部没有单个库的包?您可以导入无库包作为依赖项吗?

rust rust-cargo

14
推荐指数
1
解决办法
1994
查看次数

为什么带有“ join”的函数组成可以改变函数输入?

我最近开始学习Haskell,并且尝试进行以下函数组合(join . mapM),但是该函数产生了一些我不理解的怪异类型。我以为GHC会假设t == mmapM类型和输出mapM中将变为m (m b)可以连接的状态,否则将不会,并且由于类型不匹配而导致错误。而是发生了以下情况:

mapM :: (Traversable t, Monad m) => (a -> m b) -> t a -> m (t b)
join :: Monad m => m (m a) -> m a
join . mapM :: Traversable t => (a -> t a -> b) -> t a -> t b
Run Code Online (Sandbox Code Playgroud)

我不知道这怎么可能。以我的理解,函数组合应该使用第一个函数的输入(或第二个函数取决于您的外观)和第二个函数的输出。但是在这里,mapM从一元函数到二进制函数的期望输入函数,我不知道为什么。即使GHC不能仅仅t == m像我一样做出这样的假设(这是我的一半期望),它也应该由于类型不匹配而出错,而不更改输入函数的类型,对吗?这是怎么回事

monads haskell function-composition

2
推荐指数
1
解决办法
93
查看次数

标签 统计

function-composition ×1

haskell ×1

monads ×1

rust ×1

rust-cargo ×1