gpt4 book ai didi

haskell - 在 Haskell 中使用 map

转载 作者:行者123 更新时间:2023-12-02 12:44:35 24 4
gpt4 key购买 nike

我想使用 map 从列表的每个元素中减去列表的平均值。到目前为止,我得到了这个计算平均值的函数:

averageOfList :: [Float] -> Float
averageOfList [] = 0
averageOfList a = ((foldl (+) 0 a) / fromIntegral(length a))

列表为[1.3,1.7,3.3,1.0,3.3]。我到底如何使用 map 中的平均值函数从每个元素中减去?

最佳答案

对于刚接触函数式编程的人来说,map 可能是他们首先遇到的概念之一。 map 是一个带有两个参数的函数:一个函数和一个元素列表。

map 的类型签名为 (a -> b) -> [a] -> [b](a -> b) 部分是传递给 map 的函数,我们将其称为 ff 接受一个值并返回另一个可能不同类型的值。 [a] 部分是要应用 f 的元素列表,我们将其称为 xs。请注意 f 的类型签名如何采用 a,而 xs 的类型签名是 [a]f 所采用的类型必须与 xs 中元素的类型匹配。另一件需要注意的事情是 map 的返回类型是 [b]。这与 f 的返回类型匹配。

这是一个使用 map 的简单示例。

plusOne :: Int -> Int
plusOne x = x + 1

xs = [1,2,3,4,5,6]
ys = map plusOne xs

在这种情况下,map 中的 a 类型将为 Intb 类型为 map 也将是 Int。让我们看一下 ab 类型不同的情况。

-- show :: a -> String
zs = map show ys

在本例中,aIntbString。我们返回一个String列表。如果您熟悉 Python 或 C 等语言,您可能已经创建了一个从 0 开始并到达数组长度末尾并更改内部元素的 for 循环。这是同一个概念。

最后,要回答您的主要问题,您需要首先将 averageOfList 应用于 [Float],然后从所得的 average 中减去列表中的每个元素。

avg = averageOfList [1.3,1.7,3.3,1.0,3.3]

subAvg x = x - avg

map subAvg [0.0,2.0,3.4,5.6]

在上面的示例中,我写出了我们想要映射到 float 列表的函数的名称和定义。另一种策略是定义内联函数而不使用名称(这称为 lambda 函数或匿名函数)。

map (\x -> x - avg) [0.0,2.0,3.4,5.6]

语法(\x -> )表示定义一个带有一个参数的函数,我们将其称为x,然后我们为该函数定义一个主体。这是一种在线定义函数而无需命名的方法。

关于haskell - 在 Haskell 中使用 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59018532/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com