我看过多个关于卫兵的帖子,而且我似乎做得很好(不在括号,缩进等之前加等号),但是在尝试运行时仍然出现错误我的简单程序。
我正在尝试学习haskell,并且正在尝试制作一个简单的程序来接收列表,如果当前索引不为0,它将在其值上添加下一个索引的索引并返回列表。 / p>
例如:
addNext [0,7,2,6]
返回[0,7,4,6]
addNext [7,1,8,3]
返回[7,2,8,3]
等... 我不知道为什么会收到此错误,并且我已经尝试了几个小时。谁能帮忙吗?
addnext :: [Int] -> [Int]
addnext (x:xs)
| x /= 0 = let head xs = elemIndex head xs + head xs
| otherwise = addnext xs
答案 0 :(得分:0)
Prelude提供了两个您可能要看的功能:
span
:: (a -> Bool) -> [a] -> ([a], [a])
span应用于谓词p和列表xs,返回一个元组,其中 第一个元素是元素xs的最长前缀(可能为空) 满足p并且第二个元素是列表的其余部分。
应用于谓词p和列表xs的
break
:: (a -> Bool) -> [a] -> ([a], [a])
break返回一个元组,其中 第一个元素是元素xs的最长前缀(可能为空) 不满足p且第二个元素是列表的其余部分。
您可以使用它们将列表分为两部分:
0
的最长前缀您所指的“索引” 是前缀的长度加1(剩余列表的第一个元素)。使用模式匹配,您可以提取该索引上的数字并添加适当的值。然后将所有内容重新组合成一个列表:
addNext :: (Num a, Eq a) => [a] -> [a]
addNext xs =
case span (==0) xs of
(ps, (q:q':qs)) -> ps ++ [q]
++ [fromIntegral (length ps) + q' + 1]
++ qs
_ -> xs