【问题标题】:haskell nested let in lambdalambda中的haskell嵌套let
【发布时间】:2013-01-13 01:08:29
【问题描述】:

我必须错过一些东西,但我不明白为什么这个人为的例子不起作用:

test1 :: Int
test1 = let g = \s -> s + s
            f = \u -> let h = \t -> t + t
                          h' = \v -> v + v
                      in  g (h (h' u))
        in f 1

ghci > 输入“h”时解析错误

但是,这个等价的部分没问题:

test2 :: Int
test2 = let g = \s -> s + s
            f = \u -> let h = \t -> t + t; h' = \v -> v + v
                      in  g (h (h' u))
        in f 1 

我认为这是我的语法问题,但我在 test1 中看不到任何错误。谢谢。

编辑: 感谢您指出找到问题的正确方法。 原来与 vim-haskellConceal 插件有关。我将代码复制粘贴到另一个编辑器中,然后切换回 vim 并注意到嵌套的 let-in 块中有不同的缩进。删除该插件后一切正常。

编辑: 我应该停止指责这个插件,因为我简单地阅读了它的代码,没有发现任何不合适的地方。也许vim7.3中的“隐藏”功能是根本原因。但我宁愿睡在温暖舒适的床上……

【问题讨论】:

  • 无法复制,此处编译为复制粘贴。您是否曾在某处使用过标签?
  • 问题是在隐藏功能激活的情况下,-> 箭头仅显示为 1 个字符宽而不是 2 个字符。因此,当您在编辑器中将 h'h 对齐时, h' 行实际上缩进了 1 个空格。

标签: haskell syntax-error let


【解决方案1】:

确实有效。我刚刚运行了该代码并得到了

~ % ghci Hello.hs 
GHCi, version 7.4.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
[1 of 1] Compiling Main             ( Hello.hs, interpreted )
Ok, modules loaded: Main.
*Main> test1 
8
*Main> 

换句话说,请确保您的代码中没有任何制表符 (\t)!

【讨论】:

  • 是的,几乎可以肯定是编辑器隐藏的缩进问题,显示的选项卡与 Haskell 解析它们的方式不同。
猜你喜欢
  • 2012-04-26
  • 1970-01-01
  • 1970-01-01
  • 2019-06-01
  • 1970-01-01
  • 2023-03-15
  • 2019-02-27
  • 2015-11-17
  • 1970-01-01
相关资源
最近更新 更多