繁体   English   中英

Haskell函数组成,(。)(。)的类型以及它是如何呈现的

[英]Haskell function composition, type of (.)(.) and how it's presented

所以我知道:

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

它的类型是(B-> C) - >(A-> B) - > A-> C但是怎么样:

(.)(.) = _? = _?

这是如何表示的? 我想到了:

(.)(.) = (f.g)(f.g)x = f(g(f(g x))) // this
(.)(.) = (f.g.h)x = f(g(h x)) // or this

但就我试图获得它的类型而言,GHCi告诉我的不正确。 那么什么都是“_?”

另外 - 函数/运算符$做什么?

首先,你的符号很邋。。

(.) = (f.g) x = f (g x)  -- this isn't true

这是真的:

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

它的类型由。给出

(.) :: (b -> c) -> (a -> b) -> a -> c
       -- n.b. lower case, because they're type *variables*

与此同时

(.)(.) :: (a -> b -> d) -> a -> (c -> b) -> c -> d
          -- I renamed the variables ghci gave me

现在让我们解决吧

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

($)

($) :: (a -> b) -> a -> b
f $ x = f x

($)只是功能应用程序。 但是,通过并置的函数应用程序是高优先级,通过($)函数应用程序优先级较低。

square $ 1 + 2 * 3 = square (1 + 2 * 3)
square 1 + 2 * 3 = (square 1) + 2 * 3  -- these lines are different

正如dave4420所提到的,

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

那么(.) (.)的类型是什么? dave4420跳过那部分,所以这里是:( (.)接受类型为b -> c的值作为其第一个参数,所以

(.) :: (   b     ->       c             ) -> (a -> b) -> a -> c
(.) ::  (d -> e) -> ((f -> d) -> f -> e)

所以我们有b ~ d->ec ~ (f -> d) -> f -> e ,得到的(.)(.)(a -> b) -> a -> c 替代,我们得到

(a -> d -> e) -> a -> (f -> d) -> f -> e

重命名,我们得到(a -> b -> c) -> a -> (d -> b) -> d -> c 这是一个函数f ,它需要二进制函数g ,值x ,一元函数h和另一个值y

f g x h y = g x (h y)

这是实现此类型的唯一方法: gx :: b -> chy :: b以及gx (hy) :: c ,根据需要。

当然在Haskell中,“一元”函数需要一个或多个参数; 类似地,“二进制”函数需要两个或更多个参数。 但不少于两个(所以使用例如succ是不可能的)。


我们也可以通过编写方程式, 组合器 1来解决这个问题。 均等推理很容易

(.) (.) x y z w q = 
((.) . x) y z w q =
(.) (x y) z w q =
(x y . z) w q =
x y (z w) q 

我们只需要在混合中输入尽可能多的变量,然后来回应用定义。 q这里是一个额外的,所以我们可以把它扔掉,并获得最终的定义,

_BB x y z w = x y (z w)

(巧合的是, (.)被称为B- combinator )。


1 abc = (\\x -> ... body ...)相当于abcx = ... body ... ,反之亦然,前提是x不出现在{a,b,c}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM