代码之家  ›  专栏  ›  技术社区  ›  J Cooper

Haskell:“do”符号对单子以外的上下文有用吗?

  •  10
  • J Cooper  · 技术社区  · 15 年前

    我们都爱你 do ,我很好奇,也许这种替代语法在单子世界之外理论上是有用的。如果是这样的话,它还能简化哪些计算呢?例如,对于应用程序来说,有一些等价的东西是有意义的吗?

    8 回复  |  直到 15 年前
        1
  •  9
  •   C. A. McCann Ravikant Cherukuri    15 年前

    考虑一下 do 对你有好处。正如travisbrown所指出的,我以前提倡使用带有 Monad 有些表达式不能用直接函数应用程序风格清晰地编写

    • 在不同嵌套深度的多个子表达式中使用的中间结果
    • 在子表达式中深度嵌套的最外层函数的参数
    • 笨拙或不一致的参数顺序,即需要将函数部分应用于除第一个参数以外的其他参数
    • 基于中间结果的深度嵌入流控制,分支间共享子表达式

    将这样一个函数作为一个表达式来编写通常需要多个嵌套lambda,或者是一种荒谬的模糊的胡说八道,这种胡说八道给无点样式起了一个坏名字。A 另一方面,block为嵌入控制流的中间结果的简单嵌套作用域提供了语法糖。

    where 但由于普通值形成一个单子,函数应用程序 (>>=) Identity monad——你可以想象用 而不是阻止,尽管人们可能会看你滑稽。


    除了范围界定/装订之外,还有一件事 block为您做的是省略将子表达式链接在一起的操作符。不难想象,在其他情况下,最好有一个“在这个块中使用这个函数组合这些表达式”的符号,然后让编译器来填充空格。

    unwords unlines 例如。的好处

    Applicative 报纸:哪里 块使用换行符来省略一元结构,成语括号使用并列符来省略提升函数的应用。这个 proc 符号 Arrow 同样,其他概念也可以以这种方式清晰地表达,例如:

    • 组合数据结构,例如合并某种类型的结果集,省略合并函数
    • 并行计算,省略结果聚合函数

    尽管要将其中的许多类型转换为单一类型或完整类型并不难 单子

        2
  •  14
  •   Community CDub    8 年前

    many Haskell programmers don't love do 最常见的一个论点是 Applicative 当你不需要 Monad 那是组合子吗 <$> <*>

    即使是一元代码,许多人更喜欢使用 =<< 显式而不是 符号。 camccann answer to your previous question about <*> 为这种偏好提供了一个奇妙的论据。

    我倾向于使用 然后在我修改时替换为组合词。这只是我自己的经验和品味的问题:对我来说,用一种更为必要的方式勾勒出事情往往是最容易的(这对我来说更方便) ),但我认为不是- 代码通常更漂亮。

    proc command do . 元组很快就变丑了。

        3
  •  7
  •   solidsnack    15 年前

    do 表示法基本上是一种表示“根据需要转换为lambdas”的方法 >>= 在两条线之间”。

    当很明显使用了什么操作符来汇总所有内容时,省略和 利用“newline”操作符。

    可编程新线将是一个很好的方式接近材料清单,应用链,&c。要制作列表,还需要一个“可编程的outdent”。真的,你可以拿三个

    • 开始 .
    • 介于两者之间 s。
    • 结束

    那你可能不该叫它

        4
  •  5
  •   Edward Kmett    15 年前

    "Applicative do"

    foo = do
        x <- bar
        y <- baz
        quux y 1234 x
    

    其中变量由 <- 只有出现在最后一行才能用Applicative实现——实际上我为这个in scheme实现了一个基于语法规则的宏,我称之为“ado”。

    这在应用效果顺序不同于“自然顺序”的情况下很有用,并且假设Haskell中存在“ado”只会导致:

    foo = (\x y -> quux y 1234 x) <*> bar <*> baz
    

    然而,词汇范围规则有点令人不安。

        5
  •  3
  •   yatima2975    15 年前

    Applicative 有(更有限,更紧凑)的习惯用法括号,请参阅 Applicative Programming with Effects ,第4页。我相信,Conor McBride的Strathclyde Haskell环境已经实现了这些。

    我不知道如何概括这些特殊的语法,但也许我没有给予足够的思考。

        6
  •  3
  •   yairchu    15 年前

    BlazeHtml 正在使用 do Monoid Monad 能够使用 ).

    所以类似的符号 幺半群 在那里,s会很有用。

    如果你看看我的游戏代码 "Defend The King" ,然后我也做了很多 mconcat 像BlazeHtml一样,我会从一个漂亮的语法中获益。

        7
  •  2
  •   sdcvvc    15 年前

    有一个单子的泛化符合 do 符号-参数化单子。看到了吗 Beyond Monads 签名。用法示例:

    test1' = do put 1
                x <- get
                put (show x)
                y <- get
                return (x,y)
    

    这是一个“状态单子”,它首先存储一个数字,然后存储一个字符串。