我对 Rust 模块层次结构中三个上层的存在以及为什么需要它们感到有点困惑。如果我理解正确的话:
我知道如果一起开发多个板条箱,则需要将它们放在一起,因此包或工作区对我来说都有意义,但我不明白为什么两者都需要存在以及为什么最多需要 1 个库限制在包裹上。这样做有什么好处呢?
我已阅读为什么 Cargo 包只能有一个库目标?这解释了每个包 1 个库箱的规则,但这让我更加困惑,因为你仍然可以拥有带有二进制文件的包,甚至“更糟糕”没有库。如果包是包管理器 Cargo 的抽象,为什么要允许其中包含二进制文件呢?为什么允许内部没有单个库的包?您可以导入无库包作为依赖项吗?
我最近开始学习Haskell,并且尝试进行以下函数组合(join . mapM),但是该函数产生了一些我不理解的怪异类型。我以为GHC会假设t == m在mapM类型和输出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像我一样做出这样的假设(这是我的一半期望),它也应该由于类型不匹配而出错,而不更改输入函数的类型,对吗?这是怎么回事