这部分代码检查给定的数字(列表中的第一个元素)是否为零 (是的,我试过== 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'
时解析错误知道为什么这不起作用吗?是不是'小伙子需要和他们一起'进来'?
感谢您的帮助,
Ĵ
答案 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 -}