Haskell解析输入“ |”上的错误,不使用后卫吗?

时间:2019-01-20 01:21:09

标签: haskell

我看过多个关于卫兵的帖子,而且我似乎做得很好(不在括号,缩进等之前加等号),但是在尝试运行时仍然出现错误我的简单程序。

我正在尝试学习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

1 个答案:

答案 0 :(得分:0)

Prelude提供了两个您可能要看的功能:

  

span :: (a -> Bool) -> [a] -> ([a], [a])

     

span应用于谓词p和列表xs,返回一个元组,其中   第一个元素是元素xs的最长前缀(可能为空)   满足p并且第二个元素是列表的其余部分。

     

break :: (a -> Bool) -> [a] -> ([a], [a])

     应用于谓词p和列表xs的

break返回一个元组,其中   第一个元素是元素xs的最长前缀(可能为空)   不满足p且第二个元素是列表的其余部分。

您可以使用它们将列表分为两部分:

  1. 0的最长前缀
  2. 其余。

您所指的“索引” 是前缀的长度加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