haskell 列表中到数字0的最小距离为Map提供该数字的数量

9rygscc1  于 2022-12-13  发布在  其他
关注(0)|答案(2)|浏览(163)

我想创建一个函数absmin,它可以得到一个浮点数列表,并返回到0的距离最小的那个数的数量。我们应该使用函数map来完成这个任务。我的第一个想法是函数abs提到了数量的问题,但我的问题是,如何才能创建到0的距离最小的点,以及使用map函数,谁能帮帮我?

absmin :: [Double] -> Int
absmin [] = []
absmin (x:xs) = abs (map (x:xs))

好了,现在我改成:

absmin xs = map abs xs

而是用规范:这不起作用,也许我是愚蠢的,但我尝试和尝试,它没有工作

5jdjgkvh

5jdjgkvh1#

如果你有一个像[3.14, 2.98, -0.1]这样的列表,并且需要找到哪个数字最接近于零,你需要首先将absMap到该列表,然后你需要找到最小值。
现在min有了Ord a => a -> a -> a的签名,所以它只会同时考虑两个数字。幸运的是,我们可以使用一个fold来折叠这个函数。

Prelude> absmin = foldr1 min . map abs
Prelude> absmin [3.14, 2.98, -0.1]
0.1

这样做的问题是,我们不知道最接近零的数字是0.1还是-0.1
我们可以定义一个minBy函数,它可以让我们基于fst这样的函数来求两个值中的最小值。
在我们将这个函数折叠到元组列表上之后,我们只需要对结果调用snd来获得原始值。

Prelude> :{
Prelude| minBy f a b
Prelude|   | f a <= f b = a
Prelude|   | otherwise  = b
Prelude| :}
Prelude> absmin' = snd . foldr1 (minBy fst) . map (\x -> (abs x, x))
Prelude> absmin' [3.14, 2.98, -0.1, 0.1]
-0.1
oyjwcjzk

oyjwcjzk2#

可以使用min()abs()函数查找数字列表中的最小绝对值,然后使用map()将该值应用于列表中的每个元素。

相关问题