gpt4 book ai didi

haskell - Haskell 中的点运算符 : need more explanation

转载 作者:行者123 更新时间:2023-12-03 05:10:43 25 4
gpt4 key购买 nike

我试图理解点运算符在此 Haskell 代码中的作用:

sumEuler = sum . (map euler) . mkList

完整的源代码如下。

我的理解

点运算符将两个函数 sum 以及 map euler 的结果和 mkList 的结果作为输入。

但是,sum 不是一个函数,它是函数的参数,对吧?那么这是怎么回事呢?

另外,(map euler) 在做什么?

代码

mkList :: Int -> [Int]
mkList n = [1..n-1]

euler :: Int -> Int
euler n = length (filter (relprime n) (mkList n))

sumEuler :: Int -> Int
sumEuler = sum . (map euler) . mkList

最佳答案

简单来说,.是函数组合,就像数学中的那样:

f (g x) = (f . g) x

就您而言,您正在创建一个新函数 sumEuler也可以这样定义:

sumEuler x = sum (map euler (mkList x))

示例中的样式称为“无点”样式 - 函数的参数被省略。在许多情况下,这使得代码更加清晰。 (第一次看到它可能很难理解,但一段时间后你就会习惯它。这是一个常见的 Haskell 习惯用法。)

如果您仍然感到困惑,联系.可能会有所帮助。类似于 UNIX 管道之类的东西。如果f的输出变为g的输入,其输出变为h的输入,您可以将其写在命令行上,例如 f < x | g | h 。在 haskell ,.工作方式类似于 UNIX | ,但是“向后”--h . g . f $ x 。我发现这个符号在处理列表时非常有用。而不是一些笨重的结构,如 map (\x -> x * 2 + 10) [1..10] ,你可以写 (+10) . (*2) <$> [1..10] 。 (而且,如果您只想将该函数应用于单个值;它是 (+10) . (*2) $ 10 。一致!)

Haskell wiki 有一篇很好的文章,其中包含更多详细信息:http://www.haskell.org/haskellwiki/Pointfree

关于haskell - Haskell 中的点运算符 : need more explanation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/631284/

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