美文网首页
Haskell的 "." 操作符

Haskell的 "." 操作符

作者: 不动点P | 来源:发表于2019-01-06 23:47 被阅读20次

The "." operator provides function composition:

  • (f . g) x = f (g x)
    examples:
countLetters = length . filter isAlpha

先来看看 "." 这个operator能干什么,"."能够做到复合函数,由数学知识我们知道,复合函数的前提是g的值域是f的定义域,换句话说,在haskell里,如果你想要用 "."来复合函数,那么你内层函数的输出就得是和外层函数的输入一个类型

比如我手上有个 F1 :: A->B , F2 :: B->C

那么这个时候 g = F1.F2 就可以复合,而且g :: A -> C

回到刚刚那个例子,isAlpha是Data.Char里定义的函数,函数签名为 Char->Bool,而filter我们知道是 (a->Bool) ->[a]->[a],显然 filter isAlpha是一个curry化的函数,他的签名是 [Char]->[Char],显然这里a是Char,haskell会自动推导出这个结论。

这个时候我们得到了 filter isAlpha 是 [Char]->[Char] 而我们知道length是[a]->[Int],你用.操作符把他们连接起来,那就是[Char]->Int

这个就是.符号的作用,通过.符号,我们可以将小的函数组合起来成为一个功能更加强大复杂的函数。这也是函数式编程提供给我们最重要的特性之一,可组合性。

接下来讲一些复杂的东西:

其实 "." 这个operator 也是一个函数,它接受两个函数为参数传出一个函数
不难写出它的类型签名:
(a->b) -> (b->c) -> (a->c)

甚至我们可以自己实现一个:

point f1 f2 = f1  f2 

然后你就可以使用

length `point` filter isAlpha

顺便一提,在haskell 的prelude中,(.)的实现是这样的:

(.)  f g = \x -> f (g x)

相关文章

网友评论

      本文标题:Haskell的 "." 操作符

      本文链接:https://www.haomeiwen.com/subject/ofljrqtx.html