输入'else' If-then-Let-Else 语句上的解析错误 (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'上解析错误

你知道为什么不起作用吗?是不是"莱特"需要和他们在一起?

谢谢你的帮助,

J

是的,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...

如果您在do块中,则可以省略in,但无论哪种方式,都不能将条件放在绑定之外。

(如果你希望将newpack修改为可变变量,那是不可能的;let所做的只是给一个值赋予一个名称,你实际上无法修改任何内容。但如何在没有这个名称的情况下构建代码超出了这个问题的范围;如果你需要帮助,你应该询问另一个。)

一些文体注释:

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

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

  • 您有很多多余的括号:drop ((length pack)-1)可以简单地为drop (length pack - 1)

写这篇文章的一个更好的方法(从纯粹的美学角度来看,即忽略列表索引和length的使用)是(使用保护):

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

是不是"我们需要和他们在一起"?

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

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

最新更新