`
cookoo
  • 浏览: 647212 次
  • 性别: Icon_minigender_1
  • 来自: Shanghai
社区版块
存档分类
最新评论

FP中减少括号的语法糖

    博客分类:
  • FP
阅读更多
在F#中内置了两个很有用的运算符 |> 和 >> ,用来串联数据和函数,有效减少括号的使用,让代码不那么lispy。这两个符号的定义很简单,在Ocaml中也一样可以方便使用。

运算符 |> 定义:

let (|>) x f = f x
val (|>) : 'a -> ('a -> 'b) -> 'b


例子:形如
f(g(h(i(x))))
可以写成
x |> i |> h |> g |> f

依此类推(抱歉,例子抽象了点)

运算符 >> 定义:

let (>>) f g x = g(f(x))
val (>>) : ('a -> 'b) -> ('b -> 'c) -> ('a -> 'c)


例子:形如
f(g(h(i(x))))
可以写成
i >> h >> g >> f >> x


注意这个类似Haskell里所谓point free style的.运算符,但是运算顺序正好相反。

运算符.的Haskell定义:

let (.) f g x = f(g(x))
(.) :: (b -> c) -> (a -> b) -> a -> c


这点从它们的类型签名也能看出来。所以,Haskell的定义符合复合函数的数学定义,但是读起来得从右向左读。而F#的定义符合从左向右读的直觉习惯,各有千秋。

这种函数串联然后再整体作用到数据上的编程风格好像也叫tacit programming。。。

Ruby中在Proc类中定义运算符也能达到类似的串联效果,当然Ruby只能重定义那么几个已经存在的运算符,不能凭空造新运算符:(
分享到:
评论
2 楼 cookoo 2007-01-10  
Thanks for the useful comment. Yes, |> is a reversed version of $ in Haskell, though |> gives a better feeling regarding the direction of pipelines. I'm pretty some neat syntax sugar of F# is borrowed from Haskell and we will see more in future (such as zip family). However, there's another voice saying Haskell Prelude is too fat and should be narrowed down a bit, hehe.

I personally feel Haskell has defined too many special symbols which can make code line-noisy easily, like Perl style syntax.
1 楼 T55555 2007-01-06  

FYI.

(|>) is "reverse" of ($).
The (|>) also shows up as euro ( to compare with $ ) on Haskell wikibook.
Haskell/Understanding monads
1.2 euro ( http://en.wikibooks.org/wiki/Haskell/Understanding_monads#euro )
...
N.B.: the euro symbol isn't valid Haskell... if you want to try this, use (|>) as an operator instead
...

(>>) uses by monad, in the book Haskell - The Craft of Functional Programming
they defines a (>.>) as "reverse" of (.)
Page 170 (Forward Composition) shows a "reverse" of function composition definition:
infixl 9 >.>
(>.>) :: (a -> b) -> (b -> c) -> (a -> c)
g >.> f = f . g

相关推荐

    语法分析器-C语言

    - 功能:从文件指针`fp`中读取下一个字符,并检查是否为特殊字符`#`。 - 逻辑:如果读取到的字符是`#`,则返回1,表示遇到终止符;否则,也返回1,表示正常读取字符。 2. **`F()`**: - 功能:识别以`#`或`i`...

    Python笔记(一)【基础语法+列表】.pdf

    `while`后面的条件不需括号,循环体也不用大括号。`if...is not...`用来判断两个对象是否不相等,`and`和`or`分别代表逻辑与和逻辑或,`not`用于逻辑取反。`for`循环常用于遍历可迭代对象,`else`子句可以与`for`...

    实验报告四递归下降语法分析程序设计.doc

    实验报告“实验报告四递归下降语法分析程序设计”涉及的是计算机科学中编译原理的一个重要概念——递归下降语法分析。递归下降分析是一种自顶向下、非回溯的语法分析方法,常用于实现LL(1)类型的解析器。 在实验中...

    Go语言学习教程之声明语法(译)

    如果该函数指针的参数也是一个函数指针,Go的语法仍然保持清晰,如`fp func(func(int, int) int, int) int`,这比C语言中的相应声明更容易理解。 Go语言的另一个创新是类型定义。在C语言中,需要通过typedef来创建...

    C和C++的复杂类型及指针声明详解.doc

    在这篇文章中,我们将详细介绍C和C++语言中复杂类型的声明方式,并解释每种类型的声明语法和实践意义。 一、基本类型的声明 在C和C++语言中,最基本的类型是整型(int)、字符型(char)、浮点型(float)等。这些...

    深入理解C语言指针的奥秘 C和C++中函数指针的含义(上).pdf

    函数指针的使用不仅限于C和C++语言,在其他许多编程语言中也有其类似的应用,尽管它们可能有着不同的语法和实现方式。例如,在Java中虽然没有函数指针的概念,但可以通过接口和匿名内部类实现类似的功能。在Python中...

    文法分析器

    3. **错误处理**:在词法分析和语法分析的过程中,可能会遇到不符合预期的输入。错误处理机制负责捕获这些问题,并向用户提供有关如何解决错误的指导。 #### 三、Java实现的文法分析器 根据题目描述,这个文法分析...

    编译原理课程设计报告

    综上所述,本课程设计报告涵盖了编译原理中的多个关键知识点,包括词法分析、语法分析、逆波兰式以及具体的编程实现等内容。这些内容不仅有助于深入理解编译器的工作原理,还为后续的学习和研究奠定了坚实的基础。

    The connection between C template metaprogramming and functional programming

    论文还专门讨论了如何将角括号表达式视为模板元编程中的一等公民,包括语法、变量、let 表达式、lambda 表达式等内容。 ##### 语法 在C++模板元编程中,角括号表达式通常用来表示模板参数列表。通过引入新的语法,...

    C/C++ 函数指针的意义,函数指针的用法

    这里的关键在于指针运算符`*`与圆括号`()`的结合顺序,`*`紧跟着类型名表示指针类型,而括号内的参数列表则定义了函数指针所指向的函数类型。 #### 2. 函数指针的错误定义示例 错误的定义方式可能会导致编译器将其...

    教你理解复杂的C_C++声明

    - 在C/C++中,可以通过在类型后加上方括号 `[ ]` 并指定大小来定义数组。 - 示例:`int arr[10];` 定义了一个包含10个整型元素的数组 `arr`。 **3. 引用** - 引用是一个别名,它不是独立的变量,而是对另一个...

    教你理解复杂的C-C++声明

    在这个例子中,你可以这样理解:“fp1是一个函数指针,它接受一个int参数,返回一个指向包含10个int的数组的指针”。 C++中的声明规则遵循以下几个步骤: 1. **变量名**:识别变量名,例如`fp1`。 2. **数组部分**...

    九月国家计算机二级C语言上机考试题库专题.pdf

    - 在给定的程序MODI1.C中,`if n = = 0`应更正为`if (n == 0)`,增加括号避免语法错误。 - `while( n > 1 && n )`语句后缺少分号,应添加分号`;`。 8. 数学逻辑: - 计算阶乘:`fun()`函数中计算`n!`(n的阶乘)...

    词法分析器C++代码

    通过调用`fgetc(fp)`读取文件中的下一个字符到`ch`变量中。然后根据读取的字符进行以下处理: - 如果`ch`是字母,则调用`IsAlpha()`进行判断,并进入字母处理流程; - 如果`ch`是数字,则调用`IsNum()`进行判断,并...

    如何理解c和c++的复杂类型声明.pdf

    在C和C++编程语言中,复杂类型声明是其语法特性的一个重要部分,尤其是在处理指针、数组、函数以及结构体等复合数据类型时。理解这些声明对于编写高效且无错误的代码至关重要。本文将深入探讨如何解析和理解C与C++中...

    堆栈的说明

    3. **编译器与解释器**:在语法分析阶段,堆栈被用于处理括号匹配,确保左括号和右括号的对应关系。 4. **内存管理**:操作系统使用堆栈来分配和释放栈内存,为局部变量提供空间。 5. **浏览器历史记录**:用户可以...

    C语言程序设计试卷及答案.doc

    在C语言中,数组可以使用大括号初始化,例如int a[5]={0,1,2,3,4,5};。数组名可以作为函数的参数,但实际上传递的是数组的首地址。 4. 字符串的定义和操作 在C语言中,字符串可以使用双引号定义,例如char str[10]...

    用c语言写的词法分析器

    词法分析器通常读取源代码文件,`fp`变量表示打开的文件指针,`fgetc`函数用于从文件中逐个读取字符。 7. 程序流程: 简单的词法分析器通常会按顺序读取源代码的每个字符,根据字符类型调用适当的处理函数(如`...

    2013年03月国家计算机二级C语言考试题库参照.pdf

    以上是针对给定的C语言考试题库中涉及的知识点的详细解释,涵盖了基本的C语言语法、函数的使用、错误修复、字符串与整数转换以及文件操作等核心概念。学习这些内容对于理解和解决C语言编程问题至关重要。

Global site tag (gtag.js) - Google Analytics