【问题标题】:parse error on input `=' in Haskell在 Haskell 中输入“=”时解析错误
【发布时间】:2014-02-07 14:33:12
【问题描述】:

我在 Haskell 中编写了以下函数

coordenadas :: (Floating a) => String -> (a, a, a)
coordenadas linea = (x, y, z)
    where  (_ : xStr : yStr : zStr : _) = words linea
           x = read $ tail xStr :: Float
           y = read $ tail yStr :: Float
           z = read $ tail zStr :: Float

这个函数是用来接收像"N1 X2 Y1 Z10"这样的字符串并产生像(2, 1, 10)这样的元组,但是当我尝试编译它时,编译器说x = read $ tail xStr :: Float行中有一个parse error on input '='

有人知道怎么解决吗?

感谢您的回答。

【问题讨论】:

  • 代码编译得很好(嗯,不是真的,因为x 的类型为Float,而您的类型签名表明它应该具有Floating a => a 类型),但在那一行没有解析错误或任何其他。
  • 我打赌这是一个缩进问题,但你能举一个linea的有效值的例子吗?
  • 谢谢,实际上是缩进问题。我是 Haskell 的初学者。
  • 缩进问题很流行。如果你想忘记它,如果你喜欢 emacs,我建议你使用 emacs + haskell-mode。如果你不这样做,这是一个很好的起点,因为 emacs 非常棒。无论如何,vim 的选项甚至很少。如果你不喜欢它们,sublime text 有一个插件。但还有一种选择:haskell web ide。真的很棒:)

标签: haskell parse-error


【解决方案1】:

我搞定了:

coordinates :: String -> (Float, Float, Float)
coordinates line = (x,y,z)
    where   (_ : xStr : yStr : zStr : _) = words line
            x = read $ tail xStr :: Float
            y = read $ tail yStr :: Float
            z = read $ tail zStr :: Float

main = do
    let line = "test x1.0 y1.0 z1.0 test"
    print $ coordinates line

这会按预期输出(1.0, 1.0, 1.0)

我自己对 Haskell 有点陌生,所以我不知道为什么它对缩进很挑剔(并且希望得到比我了解更多的人的指点!),但显然正确的做法是:

  • tabwhere再次tab,然后输入第一行
  • tab 3 次,然后将以后的行与那一行对齐

(注意:在我的编辑器中,“制表符”是“4 个空格”,而不是制表符)

编辑:我想我刚刚明白了为什么很难排好队:语法高亮!我的编辑将“where”加粗,使其变宽,从而使正确的缩进看起来不正确。我实际上通过关闭突出显示来确认这一点,只要线条彼此对齐,它似乎就可以工作。

这也意味着这种方式可能避免了类似的问题:

coordinates :: String -> (Float, Float, Float)
coordinates line = (x,y,z)
    where 
        (_ : xStr : yStr : zStr : _) = words line
        x = read $ tail xStr :: Float
        y = read $ tail yStr :: Float
        z = read $ tail zStr :: Float

【讨论】:

  • 几乎每个人都认为正确的方法是不使用标签。
  • @Carl,对不起,我应该更清楚地说明我的编辑器将制表符转换为 4 个空格。 Python 是我的主要语言,所以我已经很喜欢它了。 :)
  • 在这种情况下,规则很简单:where 块中的每个声明都需要从同一列开始。无论第一个声明从哪一列开始,其余声明都需要与之对齐。
  • 顺便说一句,这对于使用布局的所有其他事物都是相同的规则 - let 中的多个声明,do 中的多个语句等。只需将它们对齐以匹配第一个,无论你放在哪里第一个。
  • @Carl:很高兴知道,谢谢。我想我现在不应该再有任何问题了,因为我发现了我在答案中编辑的语法突出显示问题(我以前从未注意到,因为 Python 只会在行首对齐,而可变字符宽度不会影响任何东西)
猜你喜欢
  • 2016-01-11
  • 2017-08-16
  • 2018-05-02
  • 1970-01-01
  • 2013-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多