代码之家  ›  专栏  ›  技术社区  ›  0atman

为什么我们不用LISP语法编写haskell呢?

  •  1
  • 0atman  · 技术社区  · 4 年前

    它。。。有点像你们(这绝对是汇编,改编自 https://hackage.haskell.org/package/scotty ):

    main :: IO ()
    main = (do
      (putStrLn "Starting Server....")
      (scotty 3000 (do
        (get "/hello/:name"
            (text ("hello " <> (param "name") <> "!")))
    
        (get "/users"
          (json allUsers))
    
        (get "/users/:id"
          (json (filter (matchesId (param "id")) allUsers))))))
    

    (我不太了解哈斯克尔 <> 对简单的帕伦斯来说,但聪明的人很容易做到。)

    我们为什么要这样做?我们可以用任何lisp宏引擎预处理Haskell!微不足道!。

    想象一下。哈斯克尔和李斯特在一起。我们可以统治银河系!

    enter image description here

    (我知道你在想什么,但实际上我已经想清楚了:在这个例子中,维德是Lisp,卢克是Haskell,尤达是Alonzo Church)

    (编辑“谢谢所有回答和评论的人,我现在聪明多了。 我认为这种技术的最大问题还没有被提及,一位朋友IRL指出:如果你编写了一些lispy预处理器,你就会失去IDE和工具中的类型检查、语法突出显示和理解能力。这听起来像是我的硬传球。”

    “我现在正在跟踪 https://github.com/finkel-lang/finkel )

    0 回复  |  直到 4 年前
        1
  •  5
  •   danidiaz    4 年前

    Haskell的语法是 historically derived 从那个 ISWIM ,一种出现在LISP之后不久的语言,在Peter J.Landin 1966年的文章中有描述 The Next 700 Programming Languages .

    第6节专门讨论与LISP的关系:

    ISWIM可以看作是一种尝试从 存储分配,硬件相关的教学风格, 沉重的支架

    在同一节后面:

    ISWIM的文本外观与LISP的表达式不同。 更接近LISP的M表达式 (构成非正式的 程序)。ISWIM具有以下附加功能:[…]

    因此,有一个明确的意图,就是背离LISP语法,或者至少背离S表达式。

        2
  •  4
  •   Carl    4 年前

    在结构上,Haskell程序由一组模块组成。每个模块由一组声明组成。模块和声明是惰性的——它们的存在不会导致任何事情发生。它们只是在静态命名空间中形成条目,编译器在生成代码时使用这些条目解析名称。

    作为旁人,你可能会争论 Main.main 主.Main ,而不仅仅是因为它存在。

    这里的事情得到了更多的意见为基础。我认为Lisp的动态结构与其语法的规则性密切相关。语法检查无法区分用于向全局命名空间添加值的s表达式和用于运行其副作用的s表达式。如果没有句法上的区别,加上语义上的区别就显得很尴尬。所以我认为Lisp语法在某种意义上 太规律了 用于Haskell中不同类型代码之间有严格语义分隔的语言。相比之下,Haskell的语法提供了与语义区别相匹配的句法区别。

        3
  •  3
  •   Poscat    4 年前
    1. Haskell有一个右关联函数应用程序(即($)),它覆盖了括号的大多数用例
    2. 空白在Haskell中有语义意义,这就是为什么大多数使用write
    do
      p1
      p2
      p3
    

    而不是

    do { p1
       ; p2
       ; p3
       }