通过以下方式链接的函数链:

时间:2015-02-17 17:30:45

标签: haskell currying

我正在学习Haskell LYAH教程。我在Walk the line部分。它介绍了非常有用的运营商:

x -: f = f x 

它允许使用此运算符获取初始状态和链函数:

(0,0) -: landLeft 1 -: landRight 4 -: landLeft (-1) -: landRight (-2)

我的问题是如何才能使用这一系列功能并给它一个单独的名称?例如:

chain = landLeft 1 -: landRight 4 -: landLeft (-1) -: landRight (-2)
(0,0) -: chain

2 个答案:

答案 0 :(得分:4)

您可以提供明确的参数

chain x = x -: landLeft 1 -: landRight 4 -: landLeft (-1) -: landRight (-2)

此运算符本身并不十分有利于链接操作,它实际上只是flip ($),而且我们知道您无法执行chain = h $ g $ f之类的操作来替换h $ g $ f $ x。相反,将$替换为.是常见的,如chain = h . g . f中所示。如果您想使用从左到右的样式,我建议您创建一个单独的运算符,使其等同于flip (.)

(-:) = flip ($)
(-.) = flip (.)

chain = landLeft 1 -. landRight 4 -. landLeft (-1) -. landRight (-2)

或者您可以使用Control.Arrow中的运算符和-:运算符:

import Control.Arrow

chain = landLeft 1 >>> landRight 4 >>> landLeft (-1) >>> landRight (-2)

> x -: chain

实际上,鉴于Control.Arrow中的运营商,您可以定义landLeftlandRight

landLeft c = first (+c)
landRight c = second (+c)
landBoth c = (+c) *** (+c)

答案 1 :(得分:3)

不,你不能。原因是

chain = x -: y -: z

装置

chain = z (y x)

因此,当你申请w -: chain时,你会得到

w -: chain = z (y x) w

本质上是垃圾,类型检查器可能会抱怨。 你反而希望拥有

w -: chain = z (y (x w)))

您可以使用合成运算符(.)定义链。

chain = z . y . x

请注意,订单与<{1}}中的订单相反。要撤消订单,您可以改为使用

-: