在我真正问到它之前,这个问题有一个很长的前奏:)
假设类型A和B代表类别,然后是函数
f :: B - > A.
是两个类别之间的态射.我们可以创建一个新的类别,其中A和B为对象,f为箭头,如下所示:

现在,让我们介绍一个新的类别C和函数g:
g :: C - > B - > A.
我希望能够在上面的类别中添加C和g,但我不确定如何做到这一点.直观地说,我想要一些看起来像这样的东西:

但我以前从未在类别图中看到类似的东西.为了使这个犹太人,我可以引入一个虚拟箭头g'并构建一个像这样的2类:

但这似乎是一幅钝画.(当然,我们可以使用我上面提到的图片作为正确的图片的速记.)此外,它不再完全清楚g和g'甚至是什么.g不再是一个函数,它将类别C作为输入并返回一个态射:: B - > A.相反,
g'::(C - > C)
g ::(C - > C) - >(B - > A)
如果我们传递g身份,那么一切都会正常.但是,如果我们通过其他一些功能,那么谁知道会发生什么?
所以我的问题是:n类中的n-arrow真的是我们应该考虑arity n函数的方式吗?或者是否有一些更简单的方法将此功能表示为我错过的标准类别?
假设我有更高阶的功能f :: (a -> b) -> (a -> b).但f只有在输入函数是满射的情况下才能正常运行.反正有没有迫使这种情况发生在Haskell?例如,我真的希望f类型签名是这样的:
f :: (Surjective (a -> b)) => (a -> b) -> (a -> b)
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为我不希望a -> b声明该类型的所有函数都是满射的,只是其中的一部分.例如,可以f将满射函数转换为非满射函数.
我们可以将函数包装在一个特殊的数据类型中data Surjective f = Surjective f,然后定义
f :: Surjective (a -> b) -> (a -> b)
Run Code Online (Sandbox Code Playgroud)
但这会使很难为函数分配多个属性.
在练习中有没有方便的方法呢?这在理论上是否可行?
id是类型的唯一功能a -> a,和
fst类型的唯一功能(a,b) -> a.在这些简单的情况下,这是非常简单的.但总的来说,你会如何证明这一点?如果有多个相同类型的可能功能怎么办?
或者,给定函数的类型,如何导出该类型的唯一(如果这是真的)函数?
编辑:我特别感兴趣的是当我们开始在类型中添加约束时会发生什么.
我试图深入理解Monad类的层次结构.当然,部分原因是看到了很多例子,但我对这些课程的首次发现历史及其动机特别感兴趣.
我知道Monad最初是作为Haskell中IO问题的解决方案,并且熟悉Moggi和Wadler在1989 - 92年引入它们的论文.
我还看到Applicatives了Conor McBride和Ross Paterson的"有效的应用程序设计"的介绍.
我的问题是什么推广Functor,他们什么时候出现?我认为它必须是Monad因为Functor它不是一个超类,但是从LISP的早期开始就没有人使用广义的地图函数?
根据Haskell wikibook,一个Monad被调用的m是Functor另外两个操作:
unit :: a -> m a
join :: m (m a) -> m a
Run Code Online (Sandbox Code Playgroud)
这很好,但我有一些不同的东西.粉饰血淋淋的细节,我有一个具有良好的类型unit和join功能,但它fmap没有得到很好的表现(fmap g . fmap f不一定fmap (g.f)).因此,它不能成为一个实例Monad.尽管如此,我还是希望尽可能多地提供通用功能.
所以我的问题是,什么类别的理论结构与monad相似,因为他们有a unit和join?
我意识到在某种程度上,上述问题是不明确的.对于monad而言unit,join定义仅在fmap定义方面有意义.没有fmap,你不能定义任何monad法则,所以任何unit/的定义join都同样"有效".所以我正在寻找除了fmap在这些unit和join函数上定义一些"非monad"定律可能有意义的函数.
我想使用latex记录我的代码,但是在乳胶文档的开头显示所有这些模块和编译器扩展非常烦人.是否有一些标志我可以传递给lhs2TeX以防止它在pdf中显示这部分代码,同时仍然让ghc看到代码?
这似乎是一个非常基本的功能,但我在手册中找不到它.
我有一个对象,里面有一些指针.析构函数调用delete这些指针.但有时我想删除它们,有时我不删除它们.所以我希望能够在不调用析构函数的情况下删除对象.这可能吗?
编辑:我意识到这是一个绝对的想法,没有人应该这样做.尽管如此,我想这样做是因为它会使一些内部函数更容易编写.
该DLIST包包含DList数据类型,它有大量的实例,但不是Foldable或Traversable.在我看来,这是两个最"类似列表"的类型.是否存在DList不是这些类的实例的性能原因?
而且,封装确实实现foldr和unfoldr,但是没有其他的折叠功能.
构建我的应用程序时,我希望cabal自动将中间核心输出到文件中.我可以将-ddump-simpl标志添加到cabal文件的ghc-options字段中,但是这会将所有内容打印到stdout.有没有办法让cabal将所有这些重定向到文件?
我有一个github项目,使用travis进行持续集成.我想在亚马逊ec2上部署我的项目.为了简化部署,我希望部署的系统具有与测试系统相同的配置.这可能吗?
AFAICT,这需要两件事:首先,ec2预配置的实例与travis使用的设置相匹配.有人存在吗?第二,travis.yml从命令行执行脚本的方法.我怎样才能做到这一点?