这是我第一次尝试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来帮助缩进,什么也没做。
答案 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