- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图理解点运算符在此 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/
我正在查看 java 代码片段,而这个片段我无法弄清楚为什么输出是 2? package com.instanceofjava; public class A{ stat
我有这种情况: 我试图以这种方式混淆一些数据 /* item.h */ typedef struct ItemStruct *Item; /*item.c*/ #include "item.h" st
好的,我今天遇到了这个,当时 TI TMS470 C++ 编译器拒绝接受它。 这来自“Head First Design Patterns”示例代码的 C++ 翻译的 Silver 版本。 class
我正在使用 requests 模块和 Python 2.7 构建一个基本的网络爬虫。 source_code = requests.get(url) plain_text = source_code.
union([H|T],[],[H|T]). union([],[H|T],[H|T]). union([H|T], SET2, RESULT) :- member(H,SET2), u
我正在使用 requests 模块和 Python 2.7 构建一个基本的网络爬虫。 source_code = requests.get(url) plain_text = source_code.
我想要解释 GCC 生成的程序集中与 .cfi_def_cfa_offset 指令一起使用的值。我隐约知道 .cfi 指令涉及调用帧和堆栈展开,但我想更详细地解释为什么,例如,在编译以下 C 程序时
如果我反汇编我的类文件,我会得到以下形式的 LineNumberTables LineNumberTable: line 204: 0 line 205: 9 line 2
我使用 jQuery 编码已有大约 2 年了,但我从未在插件中完成过。我正在努力改变这一点。我找到了一些解释如何创建插件的网站,我了解了基础知识。 我不明白的部分是 this 关键字的使用。这是一个简
我正在开发一个 OpenGL 项目,我需要对该主题的核心组件进行一些简短的解释,因为我需要向有需要的人解释。 以下是程序部分 下面是程序中用到的全局变量和头文件 #include #include #
我正在阅读 this不错的文章,但坚持一句话以对此有更多了解。 这是什么意思(在第 8 点中提到)“允许应用程序线程与 GC 线程一起运行总是会导致应用程序线程以影响对象 Activity 性的方式改
我是 java 泛型的新手,我的问题是: public static void printArray( E[] inputArray ) 在上面的语句中,当函数的返回类型为void时,为什么我们在v
我目前正在浏览一些旧的大学 C++ 代码片段。那时,另一个类(class)中的一个被分配使用双指针和二维数组来做一个矩阵类(class)。幸运的是(或者事后看来不幸)我从来没有机会学习那样的东西。我毕
在另一个SO post ,以下示例作为对 OP 的响应给出: public static void funct1(final List list1, final E something) {
谁能告诉我为什么在运行程序时下一行显示 5 CURRENT THREAD IS: Thread[main,5,main] 该程序来自 Java Complete Reference 一书,程序如下:
我想讨论 Android 生命周期。我了解 Android 生命周期工作原理的基础知识,但我想问一些问题。 为什么 Android 应用程序不直接从运行状态移动到停止状态,为什么它首先要经过暂停阶段?
我一直在为垂直对齐而苦苦挣扎,这是一个看似足够简单的过程,但在不同的语言和元素类型中有很多特质。我已经通过 stackexchange 进行了大量阅读,但似乎无法找到共同的理解思路。 以下是我能够收集
我目前正在上算法课。以下是我在测验中做错的一个问题:基本上,我们必须用大 O 表示法表示最坏情况下的运行时间: int foo(int n) { m = 0; while (n >=2
我正试图在网络上找到一两个以简单术语解释这些内容的资源。此外,这个概念能否以实用的方式用于改进算法?如果是这样,如何?以下是我从联系人那里得到的简要说明。 I dont know where you
考虑 this link来自 Bit Twiddling Hacks 网站。为了计算尾随位,使用了以下算法: unsigned int v; // 32-bit word input to
我是一名优秀的程序员,十分优秀!