TareaHaskell.hs:36:69:错误:输入')'解析错误

时间:2019-03-06 16:47:48

标签: parsing haskell input

这是我第一次尝试Haskell。我正在尝试制作一个函数,该函数带有一个元素和一个列表,并删除该项目的第二种外观。例如,如果元素为2,列表为[2,3,4,2,5,2],则结果为[2, 3, 4, 5, 2]

但是我遇到此错误:

TareaHaskell.hs:36:69: error: parse error on input ‘)’
   |
36 |     | ( (a == x) && not (isItIn x newList) ) = ( (let newList = x:[]) && (deleteSecond a xs) ) 

代码:

isItIn :: (Eq a ) => a -> [a] -> Bool
isItIn a [] = False
isItIn a (x:xs) = if a == x
                  then True
                  else isItIn a xs

deleteSecond :: (Eq a ) => a -> ( [a] -> [a] )
deleteSecond a [] = newList
deleteSecond a (x:xs)
    | ( (a == x) && not (isItIn x newList) ) = ( (let newList = x:[]) && (deleteSecond a xs) )
    | (a == x) && (isItIn x newList) = (deleteSecond a xs)
    | otherwise = let newList = x:[] && deleteSecond a xs

我读到它可能是缩进的问题,但是我已经尝试过使用空格,来回移动它,但仍然无法正常工作。 我还使用Notepad ++和Sublime来帮助缩进,什么也没做。

2 个答案:

答案 0 :(得分:6)

问题是解析器不希望此代码中的)

(let newList = x:[])

因为在Haskell中具有let后跟的in语句是无效的。 (除了do块内部。)

我真的不清楚您的实际意图是什么,但是let的目的只是在代码块中给一个更复杂的表达式一个临时名称。没有随附let的{​​{1}}语句没有任何意义,并在此处引起解析错误。

答案 1 :(得分:4)

您的代码有点复杂。如果您进行了简化,则会更清楚地发现问题出在哪里,但是

[MeasureZ ]: =
        IF (
            FIRSTNONBLANK ( Store[Close], 1 ) = "Y",
            [MeasureX],
            [MeasureY]
        )

仅在下一个符号为let newList = x:[] 时有效。解析器抱怨您无缘无故地试图将其括起来。 let..in语句只是出于表达目的将名称临时绑定到值的一种方法。

in

就问题本身而言:这很容易通过显式递归来解决。

let var = value in expr