【问题标题】:How to fix indentation? Haskell: parse error on input `|'如何修复缩进? Haskell:输入“|”时解析错误
【发布时间】:2019-10-21 13:10:09
【问题描述】:

所以我得到了错误:

error:
parse error on input `|'

   | x == 'a' = True

代码本身是:

module SubstitutionCiphers where
import AssignmentHelp.Cipher

validateCipher ::  Cipher -> Boolean
  validateCipher "" = False
  validateCipher (x:xs) 
    | x == 'a' = True
    | otherwise = validateCipher xs

我尝试以各种不同的方式交替缩进,但似乎没有任何效果。我想这仍然是一个缩进问题,但我不知道如何解决它。

【问题讨论】:

  • 不要在签名下缩进。

标签: haskell


【解决方案1】:

当您缩进定义的第一行时,解析器(在此上下文中)认为您正在继续上一行,就好像您已经写了一样

validateCipher :: Cipher -> Bool validateCipher "" = False -- etc

这通过更简单的定义变得显而易见

validateCipher :: String -> Bool
  validateCipher _ = True

因为解析器能够接受这一点。但是,类型签名的最终放置是无效的。

<interactive>:11:1: error:
    Illegal type signature: ‘String -> Bool validateCipher _’
      Type signatures are only allowed in patterns with ScopedTypeVariables

(我怀疑,如果 ScopedTypeVariables 扩展不存在,您会在 = 上得到更通用的解析器错误。)

在您的实际定义中,解析器会继续尝试解析类型签名,并且在看到| 之前不会遇到句法 问题。

解决办法是不缩进定义:

validateCipher ::  Cipher -> Bool
validateCipher "" = False
validateCipher (x:xs) 
  | x == 'a' = True
  | otherwise = validateCipher xs

【讨论】:

    【解决方案2】:

    您不应缩进签名下方的部分。写成这样:

    validateCipher ::  Cipher -> Bool
    validateCipher "" = False
    validateCipher (x:xs)
        | x == 'a' = True
        | otherwise = validateCipher xs

    或者您可以通过以下方式进行检查:

    validateCipher :: Cipher -> Bool
    validateCipher = elem 'a'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-11
      • 2018-05-02
      • 1970-01-01
      • 2013-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多