代码之家  ›  专栏  ›  技术社区  ›  Stephane Rolland

为什么输入中的箭头在proc块中的箭头命令中不可用?

  •  1
  • Stephane Rolland  · 技术社区  · 6 年前

    在我学习箭头的过程中,我偶然发现了一个随着时间流逝而变得越来越清晰的点:

    从约翰休斯的论文“将单子概括为箭头”中,我注意到下面(案例一)是不可能的,因为 箭头 f in参数不能在arrow过程的本地范围内使用。

    -- case I
    proc (f,x) -> returnA <- f -< x     --- here the f is illegal   
    

    如果我们还有一支箭, otherArrow ,在其他地方定义,我们可以:

    -- case II
    proc (f,x) -> returnA <- otherArrow -< x
    

    我明白 -< 好像没有应用箭头来应用 x 它的输入。所以我们用 -&中尉; 为了达到这个目的(案例二)。

    但我不明白为什么不能使用参数中给出的箭头 proc 块。( f型 在里面 proc (f,x) 在案例一中)。

    我的不理解与一个常用的术语相冲突: 箭头命令 . 论文坚持认为它不等同于haskell表达式,haskell类型系统不适合将arrow命令作为语言的第一类。

    同样,我不明白是什么事实/属性使得它不可能成为Haskell类型系统中的第一类。理解这种不可能背后的原因似乎是我需要的洞察力。

    根据Ross Paterson论文中的语法:

    exp ::=   ...
            | proc pat -> cmd
    
    cmd ::=   exp -< exp
            | form exp cmd1 ... cmdn 
            | cmd1 op cmd2
            | K pat -> cmd
            | (cmd)
    

    从这个语法我不明白不可能的原因。

    但根据翻译规则我们有:

    proc p -> e1 -< e2 = arr $ \p -> e2 >>> e1 -- if intersect Vars(p) and Vars (e1) is empty 
                       = arr $ \p -> (e1,e2) >>> app -- otherwise
    

    在第一个分支中,我们看到 p e1 应该是空的。。。这种可变范围限制是arrow命令的主要特点吗?我是说,在Haskell中,arrow命令不可能成为一流命令的原因是什么?

    正如我所要求的,我的思想在 箭头命令 以及 箭的组成 (使用类似于>>,最终生成箭头本身的运算符)和一个简单的 箭头 .

    1 回复  |  直到 6 年前
        1
  •  3
  •   leftaroundabout    6 年前

    事实上,语法似乎太弱,无法指出这个问题。

    你基本上已经发现了什么使得“箭”的威力不如“蒙娜”。(FTR,我不喜欢这种比较——箭头是一种抽象,它来自于与monad根本不同的方向,只是如果与 Kleisli 类别。)

    proc 记谱法是个骗局。它允许您为根本不一定与实际值对应的变量命名(即,也可以与lambda绑定的变量)。没关系,只要你用右边的 -< ,其中,脱糖者将知道如何将其转换为扇出/投影操作。尤其是你的 caseII 减糖剂

       proc (f,x) -> returnA <- otherArrow -< x
    ≡  proc   fx -> returnA <- otherArrow -< snd fx
    ≡                 id  <<< otherArrow <<< arr snd
    

    但是在 案例二 ,尝试绑定虚拟变量 f 它本身就代表了一个要在链中使用的箭头。这是个问题,因为如果我们已经有了这个变量,你就不能建立一个通过这个变量的链!