我正在学习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
答案 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
中的运营商,您可以定义landLeft
和landRight
:
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}}中的订单相反。要撤消订单,您可以改为使用
-: