0

我目前正在学习如何在 Haskell 中使用递归,并且试图了解如何遍历整数列表中的每个元素并将它们取反。到目前为止,我可以做到这一点,但只能在列表的最后一个元素上,所以我知道错误在最后一行。遍历列表中每个元素而不仅仅是最后一个元素的最佳方法是什么?

negation :: [Int] -> [Int]
negation [] = []
negation [n] = [-n]
negation(x:xs) = negation xs
4

4 回答 4

3

尝试使用cons运算符:将​​否定的数字放在列表的前面。

negation (x:xs) = -x : negation xs

如果你这样做,你可以摆脱第三行。

于 2016-02-08T18:28:35.303 回答
2

好吧,编写函数的最佳方法是:

negation :: [Int] -> [Int]
negation xs = map negate xs

{- Example:

>>> map negate [1..5]
[-1,-2,-3,-4,-5]
-}

练习:编写您自己的版本map

myMap :: (a -> b) -> [a] -> [b]
myMap _ [] = _fillMeIn
myMap f (x:xs) = _fillMeIn
于 2016-02-08T18:47:44.187 回答
0

如之前的答案中所述,最好的方法是使用高阶函数,如下所示

negation xs = map negate xs

尽可能使用高阶函数。它是 wiki.haskell.org 上的通用 Haskell 编程指南之一,它简化了您的代码。

于 2016-02-09T05:57:06.547 回答
0

简单的地图:

  Prelude> let negatList= map (*(-1))

例子:

  Prelude> negatList []
  []
  Prelude> negatList [1]
  [-1]

使用递归:

 negation :: [Int] -> [Int]
 negation [] = []
 negation(x:xs) = -x:negation xs
于 2016-02-08T19:44:07.830 回答