if-Then-Let-Else语句(Haskell)上输入'else'的解析错误

时间:2012-03-23 19:06:56

标签: haskell

这部分代码检查给定的数字(列表中的第一个元素)是否为零 (是的,我试过== 0但有其他错误) 然后它返回除第一个列表之外的另一个列表的所有元素。 如果没有,则返回另一个列表。 该函数的类型为[a],'newpack'需要是一个变量,因为它将在以后使用。

                              if ((position!!1) < 1)
                                then 
                                    let newpack =   drop ((length pack)-1) pack
                                else
                                    let newpack = (take ((position!!1)-1) pack) ++ (drop ((position!!1)+1) pack)

错误是46:73:输入'else'

时解析错误

知道为什么这不起作用吗?是不是'小伙子需要和他们一起'进来'?

感谢您的帮助,

Ĵ

2 个答案:

答案 0 :(得分:4)

是的,in部分不是可选的。你可以这样写:

let newpack = if (position !! 1) < 1
                then drop ((length pack)-1) pack
                else (take ((position!!1)-1) pack) ++ (drop ((position!!1)+1) pack)
in ...rest of code...

如果您处于阻止状态,那么您可以省略in以上,但不管怎样,您都不能将条件置于绑定之外。

(如果您希望修改newpack,就好像它是一个可变变量一样,那是不可能的;所有let都会给一个值名称 ,你实际上无法修改任何东西。但是如何在没有这个的情况下构建你的代码将超出这个问题的范围;如果你需要帮助,你应该问另一个。)

一些风格的笔记:

  • 显式列表索引通常被认为是一个坏主意;根据它的用途,您可能需要考虑将position作为元组或其他数据结构。

  • 同样地,length也可能是一个坏主意(它必须遍历整个列表才能给出结果)。

  • 您有很多多余的括号:drop ((length pack)-1)可以只是drop (length pack - 1)

一种更好的写作方式(从纯粹美学的角度来看 - 即忽略列表索引和使用length)将是(使用guards):

let firstPos = position !! 1
    newPack
      | firstPos == 0 = drop (length pack - 1) pack
      | otherwise     = take (firstPos - 1) pack ++ drop (firstPos + 1) pack
in ...

答案 1 :(得分:2)

  

是不是'让'需要'和'在一起?'

是。 (do - 块是一种特殊情况;但是,即使在do - 块中,块的其余部分有点像在隐式in中。)您可能会考虑编写像这样的东西:

let newpack = if {- ... -} then {- ... -} else {- ... -} in
{- the rest of your computation that uses newpack -}