当前位置:  开发笔记 > 编程语言 > 正文

在Haskell中`(a - > b) - >(c - > d)`

如何解决《在Haskell中`(a->b)->(c->d)`》经验,为你挑选了1个好方法。

这是另一个Haskell-through-category-theory问题.

让我们以简单而着名的方式为例.fmap?所以fmap :: (a -> b) -> f a -> f b,省略实际上f是一个事实Functor.据我了解,(a -> b) -> f a -> f b不过是一个语法糖(a -> b) -> (f a -> f b); 结论:

(1) fmap是产生功能的功能.

现在,Hask也包含函数,因此(a -> b),特别(f a -> f b)是Hask的一个对象(因为Hask的对象是明确定义的Haskell类型 - a-ka数学集 - 并且确实存在(a -> b)每种可能的类型集a,对?).所以,再一次:

(2) (a -> b)是Hask的一个对象.

现在奇怪的事情发生了:fmap显然,它是Hask 的态射,因此它是一个函数,它接受另一个函数并将其转换为另一个函数; 最终功能尚未应用.

因此,我们需要一个更Hask的射从获取(f a -> f b)f b.对于每个i类型的项目,a存在一个apply_i :: (f a -> f b) -> f b定义为的态射\f -> f (lift i),其中lift i是一种f a用特定i内部构建的方法.

另一种看待它的方式是GHC:(a -> b) -> f a -> f b.与我上面所写的相反,(a -> b) -> f a是映射到Hask的常规对象.但是这种观点与Haskell的基本公理相矛盾 - 没有多元函数,而是应用(curried)替代方案.


我想在这一点上问:(a -> b) -> f a -> f b假设是一个(a -> b) -> (f a -> f b) -> f b,为了简单而加糖,还是我错过了一些真正非常重要的东西?



1> leftaroundab..:

(a -> b) -> f a -> f b假设是一个(a -> b) -> (f a -> f b) -> f b,加糖为了简化

不,我认为你所缺少的,并不是你的错,只是一个非常特殊的情况,中间箭头可以被称为态射,就像外壳一样.Functor类的一般情况是(伪语法)(a -> b) -> (f a -> f b)(a -> b) -> (f a -> f b)

class (Category (??>), Category (~>)) => Functor f (??>) (~>) where
  fmap :: (a ??> b) -> f a ~> f b

因此,它将类别中的态射映射到类别中的??>态射中的态射~>,但这种态射映射本身只是一个功能.你的权利,在Hask中,特别是函数箭头与态射箭头是同一种箭头,但从数学上讲,这是一个相当简洁的场景.


@SerejaBogolubov这不是滥用; 没有任何其他常见的右关联,非交换运算符可用于直觉.关于`(a - > b) - > fa - > fb`意味着什么,没有*含糊不清.因为它是右关联的,唯一可能的解析是(切换到前缀表示法)`( - >)(a - > b)(( - >)(fa)(fb))`.
@SerejaBogolubov你是否也反对'3*4*5`是一种滥用符号,我们应该被迫写'(3*4)*5`或'3*(4*5)`?那么`1 - 2 - 3`或`f $ g $ x`怎么样?如果您同意操作员默认在计算级别关联哪种方式的概念,那么为什么不在类型级别呢?
推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有