首页 文章

理解( . )的类型签名

提问于
浏览
4

我只是使用Richard Bird的书学习Haskell和函数式编程,并且遇到了( . )函数的类型签名 . 亦即

(.) :: (b -> c) -> (a -> b) -> (a -> c)

和相关的定义

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

我理解操作员正在做什么但是对于如何阅读类型签名感到有点困惑 . 是说( . )将第一个参数作为类型(b - > c)的函数,然后返回一个类型为(a - > b)的函数,最后返回一个类型为(a - > c)的函数?这是读取类型签名的正确方法吗?

此外,这可能是一个currying的例子,其中( . )是一个带有两个参数的curry函数?或者这不是思考currying的正确方法吗?

2 回答

  • 4

    你几乎得到它,它需要 b -> c 并返回一个函数 (a -> b) -> (a -> c) ,当给定 (a -> b) 返回一个函数 a -> c . 知道在Haskell中,您可以将运算符包装在parens中并使用它前缀,这也可能会有所帮助

    f . g === (.) f g
    

    现在,更容易看到currying

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

    最后,请注意此类型签名相当于

    (b -> c) -> (a -> b) -> a -> c
    

    由于 -> 是正确的关联 .

  • 12

    您可以使用以下几个参数读取函数签名:

    (.) :: (b -> c) -> ((a -> b) -> (a -> c))
    

    所以, (f .) :: (a -> b) -> (a -> c)

    接下来是一样的:

    foo :: a -> b -> c -> d -> e
    
    foo :: a ->(b ->(c ->(d -> e)))
    

    函数 (.) 将2个函数 (a -> b) 作为参数并返回其组成

相关问题